Это должно работать так же, как ответ @Gilles, но более компактно:
rm -rf {,.[!.],..?}*
или
rm -rf dir/to/files/{,.[!.],..?}*
также следует добавить if
для использования в скриптах на всякий случай:
if [ -d "$DIR" ]; then
rm -rf ${DIR}/{,.[!.],..?}*
fi
На самом деле все зависит от версии date
, которую вы используете.
GNU date
ожидает, что дата ввода будет yy[y]*mmdd
как в20170713
(13 июля 2017 )или1000901123
(23 ноября 100090, да, год faaaar в будущем; -)). Он надежно печатает даты до 10 дикситов, не знаю, что он делает в последующие годы... год, когда 2140000000
работает, год 2150000000
не работает в моей системе.
Вы также можете использовать человеческие выражения, такие как date -d 'yesterday'
, опять же, не переносимые.
Используйте sed
, чтобы преобразовать дату в yyyymmdd
.
GNU date
делает все возможное, чтобы проанализировать ваш ввод, но некоторые форматы по своей сути неоднозначны.
BSD date
позволяет (или практически требует )указать формат ввода с помощью -f
, а затем просто анализирует ввод в соответствии с этим, выдавая ошибку, если ввод не соответствует формату.
Ожидание или требование стандартных инструментов для поддержки нелогичного и случайного формата даты, подобного вашему, в любом случае кажется ошибочным. Стандартные инструменты должны поддерживать стандартные форматы, и я думаю, что в долгосрочной перспективе вы обнаружите, что для ваших скриптов и программ имеет смысл использовать внутренний -удобный для компьютера формат. Для взаимодействия с людьми со странным поведением достаточно просто написать простую функцию-оболочку, например
Wackydate () {
local day # local is a Bashism
local mon
local year
year=${1%????}
mon=${1#$year??}
day=${1#$year}
day=${day%$mon}
shift
date -d "$year$mon$day" "$@"
}
Подстановки параметров оболочки ${variable#prefix}
и ${variable%suffix}
возвращают значение variable
с любым подстановочным знаком в выражении после удаления #
или %
в начале или конце соответственно.