Мне нужно удалить файлы старше 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/
не нужно было указывать для каждого параметра?/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
был разветвленtmpreaper
, что (по крайней мере, в Debian) кажется его заменой.