Zadanie Cron do usuwania plików starszych niż 3 dni

21

Muszę usunąć pliki starsze niż 3 dni z zadaniem cron w 3 różnych katalogach. (te 3 katalogi są potomkami katalogu nadrzędnego /a/b/c/1i /a/b/c/2& /a/b/c/3) Czy można tego dokonać za pomocą jednego wiersza w pliku crontab?

KingKongFrog
źródło

Odpowiedzi:

26

Jest to dość łatwe (choć należy pamiętać, że czas ten zmienia się ponad 3 dni temu, ponieważ czas tworzenia jest dostępny tylko w niektórych systemach plików ze specjalnymi narzędziami):

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-delete

Usuń #przed, -deletegdy masz pewność, że znajdzie pliki, które chcesz usunąć.

Aby uruchomić go przez crona, prawdopodobnie po prostu utworzę skrypt wykonywalny (dodaj shebang - #!bin/shdo górnej linii pliku i uczynię go wykonywalnym chmod a+x), a następnie umieści go w odpowiednim cronkatalogu, takim jak /etc/cron.dailylub /etc/cron.weekly. Oczywiście pod warunkiem, że nie potrzebujesz bardziej szczegółowego harmonogramu i że te katalogi istnieją w Twojej dystrybucji.

Aktualizacja

Jak zauważono poniżej, -delete opcja findnie jest zbyt przenośna. Podejście zgodne z POSIX to:

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-exec rm {} +

Ponownie usuń, #gdy masz pewność, że masz odpowiednie pliki.

Aktualizacja 2

Cytat z komentarza Stéphane Chazelas poniżej:

Pamiętaj, że -exec rm {} +ma podatności na warunki wyścigowe, których -delete(jeśli są dostępne) nie mają. Nie używaj go więc w katalogach, które inni mogą zapisywać. Niektóre znaleziska mają również narzędzie, -execdirktóre ogranicza luki w zabezpieczeniach.

Graeme
źródło
Dzięki! Czy istnieje sposób na określenie katalogu nadrzędnego, a następnie katalogów podrzędnych, aby /a/b/c/nie trzeba było określać dla każdej opcji?
KingKongFrog,
Oczywiście, możesz to zrobić w powłoce POSIX /a/b/c/[12], ale jest to naprawdę odpowiednie, jeśli podkatalogi mają nazwy jednoliterowe. W bashwas może zrobić /a/b/c/{1,2}. Oczywiście musiałaby to być linia bang dla skryptu #!/bin/bashlub jeśli używasz crontab, musisz upewnić się, że jest skonfigurowany do używania bash(naprawdę nie polecam go zmieniać, jeśli nie jest).
Graeme
2
ekspansja nawiasów klamrowych jest funkcją csh i jest również obsługiwana przez ksh, bash, zsh i fish, dzięki czemu masz szeroki wybór muszli. ksh, basha zshtakże mają operatorów naprzemiennych w swoich globach. Pamiętaj, że -exec rm {} +ma podatności na warunki wyścigowe, których -delete(jeśli są dostępne) nie mają. Nie używaj go więc w katalogach, które inni mogą zapisywać. Niektóre znaleziska mają również narzędzie, -execdirktóre ogranicza luki w zabezpieczeniach.
Stéphane Chazelas
Nie rm -fobsługuje błędów po cichu, a tym samym radzi sobie z ewentualnymi warunkami wyścigu -exec?
Acumenus,
9

Lepiej byłoby użyć 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.
Barry Chapman
źródło
2
tmpwatchzostał rozwidlony tmpreaper, co wydaje się (przynajmniej na Debianie) zastępstwem.
Jaap