Usuwanie plików starszych niż 7 dni

79

Piszę poniżej polecenie, aby usunąć wszystkie pliki starsze niż 7 dni, ale to nie działa:

find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;

Jak mogę usunąć te pliki?

Malihe Pakyari
źródło
5
Powinna być spacja między namea '*.gz'.
Jos

Odpowiedzi:

136

Jak zauważył @Jos, brakuje Ci spacji między namei '*.gz'; również do przyspieszenia wykorzystania poleceń -type fopcję uruchamiając polecenie na f iles tylko.

Stałym poleceniem byłoby:

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' \;

Wyjaśnienie:

  • find: Komenda UNIX znalezienia f ÎLES / d irectories / l farb itp
  • /path/to/: katalog, w którym chcesz rozpocząć wyszukiwanie.
  • -type f: znajdź tylko pliki.
  • -name '*.gz': lista plików, które kończą się na .gz.
  • -mtime +7: rozważ tylko te, których czas modyfikacji jest starszy niż 7 dni.
  • -execdir ... \;: dla każdego znalezionego wyniku wykonaj następującą komendę w ....
  • rm -- '{}': usuń plik; ta {}część zastępuje wynik wyszukiwania z poprzedniej części. --oznacza, że ​​parametry końca polecenia unikają błędów w pytaniach dla plików rozpoczynających się od łącznika .

Alternatywnie użyj:

find /path/to/ -type f -mtime +7 -name '*.gz' -print0 | xargs -r0 rm --

Od człowieka znajdź :

-print0 
      True; print the full file name on the standard output, followed by a null character 
  (instead of the newline character that -print uses). This allows file names that contain
  newlines or other types of white space to be correctly interpreted by programs that process
  the find output. This option corresponds to the -0 option of xargs.

Co jest nieco bardziej wydajne, ponieważ wynosi:

rm file1 file2 file3 ...

w przeciwieństwie do:

rm file1; rm file2; rm file3; ...

jak w -execmetodzie.


Alternatywnym, a także szybszym poleceniem jest użycie +terminatora exec zamiast\; :

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' +

To polecenie będzie uruchamiane rmtylko raz na końcu zamiast za każdym razem, gdy plik zostanie znaleziony, a to polecenie jest prawie tak szybkie, jak użycie -deleteopcji jak we współczesnym find:

find /path/to/ -type f -mtime +7 -name '*.gz' -delete
αғsнιη
źródło
3
Dlaczego nie miałbym iść prosto -deletena koniec? Po co mieszać z +lub \;?
rain01
3
@ rain01 plz przeczytaj unix.stackexchange.com/q/167823/72456
αғsнιη
2

Ostrożnie usuwaj pliki przy pomocy find. Uruchom komendę z opcją -ls, aby sprawdzić, co usuwasz

find /media/bkfolder/ -mtime +7 -name '*.gz' -ls . Następnie pobierz polecenie z historii i dołącz-exec rm {} \;

Ogranicz obrażenia, które może zadać polecenie znajdowania. Jeśli chcesz usunąć pliki z tylko jednego katalogu, -maxdepth 1uniemożliwia find przechodzenie przez podkatalogi lub przeszukiwanie całego systemu, jeśli literówka /media/bkfolder /.

Inne limity, które dodaję, to bardziej szczegółowe argumenty nazwy, takie jak -name 'wncw*.gz'dodawanie nowszego niż czas -mtime -31i cytowanie przeszukiwanych katalogów. Są to szczególnie ważne, jeśli automatyzujesz porządki.

find "/media/bkfolder/" -maxdepth 1 -type f -mtime +7 -mtime -31 -name 'wncw*.gz' -ls -exec rm {} \;

zeke
źródło