Удалить подкаталоги с YYYYMMDD в имени старше N дней

Почему вы используете клавишу вставить на клавиатуре? Просто нажмите i . (Он никогда не переключит вас в режим замены. В худшем случае он наберет букву «i» и вы сможете нажать клавишу возврата.)

Кроме того, внизу экрана vi будет немного строка состояния с надписью «ВСТАВИТЬ», когда вы находитесь в режиме вставки.


Emacs и vi очень разные, поэтому довольно странно видеть вопрос, в котором предлагается решение, одинаково работоспособное для обоих.


Если вы в основном используете режим вставки для vi , вы можете узнать больше о нормальном режиме .

2
01.09.2017, 22:59
4 ответа

Я думаю, что решением будет более простая версия того, что опубликовал glenn jackman , например.

seven_days=$(date -d "7 days ago" +%Y%m%d)
for f in [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]; do
   [ -d "$f" ] || continue
   (( $f < $seven_days )) && echo rm -r "$f"
done

Удалите echo, если результаты выглядят правильно.

Тест -dгарантирует, что мы проверяем только (удаляем )каталоги.

5
27.01.2020, 21:58

Вы не должны разбирать ls, вместо этого вы можете сделать что-то вроде этого:

for f in *; do test "$f" -lt "$date" && do something; done

Для вашего примера, для следующих каталогов иdate=20170825:

$ ls
20170817  20170823  20170828  20170901
$ for f in *; do test "$f" -lt "$date" && echo "$f"; done
20170817
20170823
0
27.01.2020, 21:58

Просто используйте команду find.

find. -type d ! \( -name "$(date -d "-7 days" +%Y%m%d)" \
    $(eval printf "%s" "\" -o -name \
   \$(date -d -"{6..0}"days +%Y%m%d)\"") -o -name. \) -exec rm -rf -- '{}' +
  • Только д истори-type d
  • Только директора, чьи имена старше 7 дней.
  • Удалить этот каталог и его содержимое rm -rf -- '{}'сразу+
0
27.01.2020, 21:58

Одной командой find:

date_week_ago=$(date -d "7 days ago" +%Y%m%d)
find. -type d -regextype posix-extended -regex '.*/[0-9]{8}$' \
       -exec bash -c 'd=$(basename {}); (( '$date_week_ago' > $d )) && rm -rf "$d"' \;
0
27.01.2020, 21:58

Теги

Похожие вопросы