Usuń pliki starsze niż X dni +

143

Znalazłem polecenie usunięcia plików starszych niż 5 dni w folderze

find /path/to/files* -mtime +5 -exec rm {} \;

Ale jak to zrobić dla podkatalogów w tym folderze?

Teddy291
źródło
Masz na myśli pliki w podkatalogach? czy same podkatalogi?
rahul
3
find /path/to -type d -empty -delete
Koszt
2
Usuń pliki z podkatalogów, które mają również
ponad
3
Prawdopodobnie fajnie, gdy mam pliki ze spacjami. Np. Plik o nazwie „test one” i rm zostaje zasilony rm test one. (Który usunie plik o nazwie „test” i plik o nazwie „jeden”, ale nie plik o nazwie „test jeden”). Podpowiedź: -delete or -print0
Hennes
6
Na marginesie zawsze cytuj podany argument,find aby uniknąć problemów ze znakami specjalnymi, jak wspomniano w pierwszym wierszu odpowiedzi. Np .:find /path/to/files/ -exec somecommand '{}' \;
Walf

Odpowiedzi:

240

Uważaj na specjalne nazwy plików (spacje, cudzysłowy) podczas przesyłania do rm.

Istnieje bezpieczna alternatywa - opcja -delete :

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

To wszystko, nie ma osobnego wywołania rm i nie musisz się martwić o nazwy plików.

Wymień -deletesię -depth -printprzetestować tego polecenia przed uruchomieniem go ( -deleteimplikuje -depth).

podstawowy 6
źródło
23
Służy również -type fdo usuwania samych plików (i przechowywania podkatalogów)
Oleg
3
Alternatywnie, jeśli chcesz zrobić to samo dla wszystkich plików WIĘCEJ niż pięć dni: znajdź / path / to / directory / -mindepth 1 -mtime -5 -delete
zmonteca
Jeśli moja ścieżka zawiera spacje, jak mam to zrobić? find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
Patrick Gregorio
3
@ uom-pgregorio Sugeruję umieszczenie ścieżki w cudzysłowie.
atripes
4
Zauważ, że każdy findargument jest filtrem, który wykorzystuje wynik poprzedniego filtra jako dane wejściowe. Upewnij się więc, że dodałeś -delete jako ostatni argument. IE: find . -delete -mtime +5usunie WSZYSTKO w bieżącej ścieżce.
Johan
15

Pamiętaj, że to polecenie nie będzie działać, gdy znajdzie zbyt wiele plików. Daje błąd taki jak:

bash: /usr/bin/find: Argument list too long

Oznacza to, że przekroczono limit wywołania systemowego exec dla długości wiersza poleceń. Zamiast wykonywania rm w ten sposób o wiele bardziej wydajne jest używanie xargs . Oto przykład, który działa:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

Spowoduje to usunięcie wszystkich plików (typu f) zmodyfikowanych ponad 14 dni temu w katalogu / root / Maildir / rekurencyjnie i głębiej (mindepth 1). Więcej informacji znajdziesz w instrukcji obsługi .

Juliusz
źródło
7
Per @ AfshinHamedi w odpowiedzi na AskUbuntu ( askubuntu.com/questions/589210/removing-files-older-than-7-day ), uważaj na pliki zawierające znaki nowej linii i znaki specjalne. Zamiast tego użyjfind /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
Cbhihe,
2
Lub po prostu dodaj „+” do wyników wyszukiwania
Dani_l
8

To jest to samo. Musisz podać katalog nadrzędny zamiast prefiksu plików. W twoim przykładzie byłoby to:

find /path/to -type f -mtime +5 -exec rm {} \;

Spowoduje to usunięcie wszystkich plików starszych niż 5 dni, które są poniżej /path/toi jego podkatalogów.

Aby usunąć puste podkatalogi, zapoznaj się z komentarzem @Costas powyżej.

apaul
źródło
4
Zauważ, że dla każdego pliku wykonasz polecenie rm. Jeśli masz 1000 plików starszych niż 5 dni, rm rozpocznie pracę 1000 razy. Z tego powodu rozważ opcję -delete jak w komentarzu Costy lub -exec rm {} \ +
Hennes
@Hennes: - 1) nie jestem pewien, czy musisz uciec +w takim przypadku. - 2) lepiej pisać, -exec rm '{}' +aby odpierać zło plików ze znakami specjalnymi (spacje, znaki nowej linii itp.) W ich imieniu.
Cbhihe,
-1
find . -mtime +3 -type f -not -name '*pid*' |xargs rm -rf
Susil
źródło