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?
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?
Odpowiedzi:
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.
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.
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.
/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).
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.
rm -fobsługuje błędów po cichu, a tym samym radzi sobie z ewentualnymi warunkami wyścigu -exec?
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.
tmpwatchzostał rozwidlony tmpreaper, co wydaje się (przynajmniej na Debianie) zastępstwem.
/a/b/c/nie trzeba było określać dla każdej opcji?