Есть ли какой-нибудь тривиальный способ «удалить по дате» с помощью «rm» в bash? - PullRequest
6 голосов
/ 12 января 2009

Я заметил сегодня (после ~ 8 лет счастливого взлома bash), что нет никакого тривиального способа «удалить по дате» с помощью «rm». Таким образом, решение состоит в том, чтобы объединить команды вокруг таких команд, как rm, ls, find, awk и sed.

Скажем, например, что я хотел удалить каждый файл в рабочем каталоге с 2009 года, какой будет типичный подход?

Я придумал следующее, что неприятно и должно выполняться, только если 'rm' установлен для пропуска каталогов (в противном случае вы удалите родительский каталог):

ls -la | awk '{if (substr($6,0,5)==2009) print $8}' | xargs rm

Очки как за самые элегантные, так и за невероятно сложные решения.

Ответы [ 5 ]

11 голосов
/ 12 января 2009

Я бы совмещал find и rm (без трубы)

find .  ...bunch of find criterias to select certain files (e.g. by date) .... -exec rm \{\} \;

РЕДАКТИРОВАТЬ: с параметрами для вашего примера это будет

find . -maxdepth 1 -type f -ctime -12 -exec rm \{\} \;

CAVEAT: это работает только сегодня :-). (Чтобы он работал каждый раз, замените -ctime на абсолютное время, см. TimeXY на странице руководства)

9 голосов
/ 12 января 2009

Некоторые версии find поддерживают параметр -delete, что делает его еще более эффективным ...

find . -maxdepth 1 -type f -ctime -12 -delete;

Проверьте страницу справки по поиску (для меня это работало в последних выпусках Ubuntu)

3 голосов
/ 12 января 2009

Я бы использовал:

find . -maxdepth 1 -type f -newerct 'jan 1' -print0 \
    | xargs -0 rm

(или -newermt, если вы хотите фильтровать по времени модификации)

Обратите внимание, что форма -newerXY 't' предположительно допускает любой формат даты, совместимый с cvs (см. doco ).

1 голос
/ 12 января 2009

Вместо парсинга ls (1), который может слишком легко сломаться, вы должны полагаться на stat (1):

stat -c '%z/%n' files_or_glob | grep '^date' | cut -d/ -f2- | xargs -d '\n' rm -i

, например

$ stat -c '%z/%n' *| grep '^2008-12-16' | cut -d/ -f2- | xargs -d '\n' rm -i

Примечание: это не будет правильно обрабатывать имена файлов со встроенными символами новой строки. Однако они редко встречаются в wil.d

1 голос
/ 12 января 2009

find(1) гораздо эффективнее делать то, что вы хотите, чем анализ ls(1) вывода.

РЕДАКТИРОВАТЬ: нужно следить за именами файлов с пробелами в них, поэтому вы хотите иметь find, который поддерживает -print0 (для использования с xargs -0) для повышения производительности.

find . -mtime +12 -print0 | xargs -0 rm -f
...