Задание Cron для удаления файлов старше 3 дней

21

Мне нужно удалить файлы старше 3 дней с помощью задания cron в 3 разных каталогах. (эти 3 каталога являются дочерними для родительского каталога /a/b/c/1& /a/b/c/2& /a/b/c/3). Можно ли это сделать одной строкой в ​​crontab?

KingKongFrog
источник

Ответы:

26

Это достаточно просто (хотя учтите, что это время модификации более 3 дней назад, поскольку время создания доступно только в определенных файловых системах со специальными инструментами):

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-delete

Удалите #до того, -deleteкак вы убедитесь, что он находит файлы, которые вы хотите удалить.

Чтобы запустить его с помощью cron, я, вероятно, просто создал бы исполняемый скрипт (добавив шебанг #!bin/shв верхнюю строку файла и сделав его исполняемым с помощью chmod a+x), а затем поместил бы его в соответствующий cronкаталог, например /etc/cron.dailyили /etc/cron.weekly. Разумеется, при условии, что вам не нужно более точное расписание, и что эти каталоги существуют в вашем дистрибутиве.

Обновить

Как отмечено ниже, -deleteопция для findне очень портативна. Подход, совместимый с POSIX:

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-exec rm {} +

Снова удалите, #когда вы уверены, что у вас есть нужные файлы.

Update2

Цитировать Стефана Шазеля комментарий ниже:

Обратите внимание, что -exec rm {} +есть уязвимости состояния гонки, которых -delete(где доступно) нет. Так что не используйте его в каталогах, которые доступны для записи другим пользователям. У некоторых находок также есть средство, -execdirкоторое смягчает эти уязвимости.

Graeme
источник
Благодарность! Есть ли способ указать родительский каталог, а затем дочерние каталоги, чтобы /a/b/c/не нужно было указывать для каждого параметра?
KingKongFrog
Конечно, в оболочке POSIX вы можете это сделать /a/b/c/[12], но это действительно уместно, если подкаталоги имеют однобуквенные имена. В bashтебе можно сделать /a/b/c/{1,2}. Конечно, тогда строка взрыва скрипта должна быть такой, #!/bin/bashили, если вы используете crontab, вам нужно убедиться, что он настроен на использование bash(я не рекомендую менять его, если это не так).
Грэм
2
Расширение скобок - это функция csh, которая также поддерживается ksh, bash, zsh и fish, поэтому у вас есть широкий выбор оболочек. ksh, bashа zshтакже имеют операторы чередования в своих глобах. Обратите внимание, что -exec rm {} +есть уязвимости состояния гонки, которых -delete(где доступно) нет. Так что не используйте его в каталогах, которые доступны для записи другим пользователям. У некоторых находок также есть средство, -execdirкоторое смягчает эти уязвимости.
Стефан Шазелас
Не rm -fобрабатывает ошибки молча, тем самым обрабатывая любое возможное состояние гонки с -exec?
Acumenus
9

Вы были бы намного лучше, используя tmpwatch

tmpwatch recursively removes files which haven't been accessed for a given time. Normally, it's used to clean up directories which are used for temporary holding space such as /tmp.
Барри Чепмен
источник
2
tmpwatchбыл разветвлен tmpreaper, что (по крайней мере, в Debian) кажется его заменой.
Яап