Мені потрібно видалити файли старше 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/не потрібно вказувати для кожного параметра?