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/1
i /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/1
i /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, -delete
gdy masz pewność, że znajdzie pliki, które chcesz usunąć.
Aby uruchomić go przez crona, prawdopodobnie po prostu utworzę skrypt wykonywalny (dodaj shebang - #!bin/sh
do górnej linii pliku i uczynię go wykonywalnym chmod a+x
), a następnie umieści go w odpowiednim cron
katalogu, takim jak /etc/cron.daily
lub /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 find
nie 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,-execdir
które ogranicza luki w zabezpieczeniach.
/a/b/c/[12]
, ale jest to naprawdę odpowiednie, jeśli podkatalogi mają nazwy jednoliterowe. W bash
was może zrobić /a/b/c/{1,2}
. Oczywiście musiałaby to być linia bang dla skryptu #!/bin/bash
lub 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
, bash
a zsh
takż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, -execdir
które ogranicza luki w zabezpieczeniach.
rm -f
obsł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.
tmpwatch
został rozwidlony tmpreaper
, co wydaje się (przynajmniej na Debianie) zastępstwem.
/a/b/c/
nie trzeba było określać dla każdej opcji?