Мне нужно удалить файлы старше 3 дней с помощью задания cron в 3 разных каталогах. (эти 3 каталога являются дочерними для родительского каталога /a/b/c/1
& /a/b/c/2
& /a/b/c/3
). Можно ли это сделать одной строкой в crontab?
Мне нужно удалить файлы старше 3 дней с помощью задания cron в 3 разных каталогах. (эти 3 каталога являются дочерними для родительского каталога /a/b/c/1
& /a/b/c/2
& /a/b/c/3
). Можно ли это сделать одной строкой в crontab?
Ответы:
Это достаточно просто (хотя учтите, что это время модификации более 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 {} +
Снова удалите, #
когда вы уверены, что у вас есть нужные файлы.
Цитировать Стефана Шазеля комментарий ниже:
Обратите внимание, что
-exec rm {} +
есть уязвимости состояния гонки, которых-delete
(где доступно) нет. Так что не используйте его в каталогах, которые доступны для записи другим пользователям. У некоторых находок также есть средство,-execdir
которое смягчает эти уязвимости.
/a/b/c/[12]
, но это действительно уместно, если подкаталоги имеют однобуквенные имена. В bash
тебе можно сделать /a/b/c/{1,2}
. Конечно, тогда строка взрыва скрипта должна быть такой, #!/bin/bash
или, если вы используете crontab, вам нужно убедиться, что он настроен на использование bash
(я не рекомендую менять его, если это не так).
ksh
, bash
а zsh
также имеют операторы чередования в своих глобах. Обратите внимание, что -exec rm {} +
есть уязвимости состояния гонки, которых -delete
(где доступно) нет. Так что не используйте его в каталогах, которые доступны для записи другим пользователям. У некоторых находок также есть средство, -execdir
которое смягчает эти уязвимости.
rm -f
обрабатывает ошибки молча, тем самым обрабатывая любое возможное состояние гонки с -exec
?
Вы были бы намного лучше, используя 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.
tmpwatch
был разветвлен tmpreaper
, что (по крайней мере, в Debian) кажется его заменой.
/a/b/c/
не нужно было указывать для каждого параметра?