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?


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).


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 .


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.