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


21

Мені потрібно видалити файли старше 3 днів із завданням cron у 3 різних каталогах. (ці 3 каталоги є дітьми батьківського каталогу /a/b/c/1& /a/b/c/2& /a/b/c/3) Чи можна це зробити одним рядком у crontab?

Відповіді:


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 {} +

Знову видаліть, #коли ви впевнені, що маєте потрібні файли.

Оновлення2

Цитую Stéphane Chazelas коментар нижче:

Зауважте, що -exec rm {} +вразливі умови перегонів, яких -delete(за наявності) немає. Тому не використовуйте його в каталогах, які можуть записувати інші. Деякі знахідки також можуть -execdirпом'якшити ці вразливості.


Спасибі! Чи є спосіб вказати батьківський каталог, а потім дочірні каталоги, тому /a/b/c/не потрібно вказувати для кожного параметра?
KingKongFrog

Звичайно, в оболонці POSIX ви можете це зробити /a/b/c/[12], але це дійсно доречно лише в тому випадку, якщо підкаталоги мають одноіменні літери. У bashвас можна зробити /a/b/c/{1,2}. Звичайно, тоді сценарій сценарію повинен бути #!/bin/bashабо якщо ви використовуєте crontab, вам потрібно переконатися, що він налаштований для використання bash(я не рекомендую змінювати його, якщо його немає).
Graeme

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), здається, є його заміною.
Яап
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.