Мені потрібно видалити файли старше 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 {} +
Знову видаліть, #
коли ви впевнені, що маєте потрібні файли.
Цитую Stéphane Chazelas коментар нижче:
Зауважте, що
-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/
не потрібно вказувати для кожного параметра?