Почему вы используете клавишу вставить
на клавиатуре? Просто нажмите i
. (Он никогда не переключит вас в режим замены. В худшем случае он наберет букву «i» и вы сможете нажать клавишу возврата.)
Кроме того, внизу экрана vi
будет немного строка состояния с надписью «ВСТАВИТЬ», когда вы находитесь в режиме вставки.
Emacs и vi
очень разные, поэтому довольно странно видеть вопрос, в котором предлагается решение, одинаково работоспособное для обоих.
Если вы в основном используете режим вставки для vi
, вы можете узнать больше о нормальном режиме .
Я думаю, что решением будет более простая версия того, что опубликовал 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
гарантирует, что мы проверяем только (удаляем )каталоги.
Вы не должны разбирать 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
Просто используйте команду 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
rm -rf -- '{}'
сразу+
Одной командой 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"' \;