Rimozione di file più vecchi di 7 giorni


79

Scrivo di seguito il comando per eliminare tutti i file più vecchi di 7 giorni, ma non funziona:

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

Come posso rimuovere questi file?


5
Dovrebbe esserci uno spazio tra namee '*.gz'.
Jos

Risposte:


136

Come ha sottolineato @Jos, hai perso uno spazio tra namee '*.gz'; anche per accelerare l'utilizzo dei comandi -type fopzione per eseguire il comando su f iles solo.

Quindi il comando fisso sarebbe:

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

Spiegazione:

  • find: Il comando unix per la ricerca di f iles / d irectories / l inchiostri, ecc
  • /path/to/: la directory in cui iniziare la ricerca.
  • -type f: trova solo i file.
  • -name '*.gz': elenca i file che terminano con .gz.
  • -mtime +7: considera solo quelli con tempi di modifica più vecchi di 7 giorni.
  • -execdir ... \;: per ciascuno di questi risultati trovati, esegui il seguente comando in ....
  • rm -- '{}': rimuove il file; la {}parte è dove viene sostituito il risultato della ricerca dalla parte precedente. --significa che i parametri di fine comando evitano di richiedere errori per quei file che iniziano con trattino .

In alternativa, utilizzare:

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

Da uomo ritrovamento :

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

Che è un po 'più efficiente, perché equivale a:

rm file1 file2 file3 ...

al contrario di:

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

come nel -execmetodo.


Un comando alternativo e anche più veloce sta usando il +terminatore di exec invece di\; :

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

Questo comando verrà eseguito rmsolo una volta alla fine anziché ogni volta che viene trovato un file e questo comando è quasi altrettanto veloce dell'uso -deletedell'opzione come segue in moderno find:

find /path/to/ -type f -mtime +7 -name '*.gz' -delete

3
Perché non dovrei andare dritto -deletealla fine? Perché pasticciare con +o \;?
rain01


2

Fai attenzione a rimuovere i file con find. Esegui il comando con -ls per verificare ciò che stai rimuovendo

find /media/bkfolder/ -mtime +7 -name '*.gz' -ls . Quindi estrarre il comando dalla cronologia e aggiungere-exec rm {} \;

Limita il danno che un comando find può fare. Se si desidera rimuovere i file da una sola directory, -maxdepth 1impedisce a find di spostarsi tra le sottodirectory o di cercare nel sistema completo se si digita /media/bkfolder /.

Altri limiti che aggiungo sono argomenti di nomi più specifici come -name 'wncw*.gz', l'aggiunta di un tempo più recente -mtime -31e la citazione delle directory cercate. Questi sono particolarmente importanti se si stanno automatizzando le pulizie.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.