Rimuovi tutti i file creati prima di una certa data


26

Ho una directory che contiene un numero elevato di file (come i registri per ogni giorno dell'anno). Vorrei rimuovere tutti i file creati prima del 22/11. Come posso raggiungerlo? Devo usare findquindi exec -rm? Sto usando ksh.


1
Il solito avvertimento è che i filesystem Unix in genere non contengono un record di quando il file è stato creato - sono disponibili solo le volte in cui l'inode e il contenuto sono stati modificati l'ultima volta .
Toby Speight,

Risposte:


35

L'utilizzo findè ancora il modo preferito di eliminare i file. Vedi http://mywiki.wooledge.org/UsingFind per ulteriori informazioni.

Un modo per farlo è quello di creare un file con il timestamp al suo interno. per esempio

touch -t 201311220000 /tmp/timestamp

Ora cancella i file GNU find(assumendo nella directory corrente) che corrispondono al timestamp es:

find . -type f ! -newer /tmp/timestamp -delete  

o non GNU find

find . -type f ! -newer /tmp/timestamp -exec rm {} \;

2
Che dire di questo ? Funziona ? trova -type f -mtime +5 -exec rm -f {} \;
user1058398,

1
@ user1058398 Che eliminerà i file più vecchi di 5 giorni da adesso.
Valentin Bajrami,

Elimina anche la cartella insieme ai file? @ val0x00ff
Alper

1
@Avatar no perché type -flimita l'azione ai soli file.
Valentin Bajrami,

22

Con GNU o alcuni BSD find:

find . ! -newermt 2013-11-22 ! -type d -delete

Si noti che controlla l'ora dell'ultima modifica dei file. Su alcuni BSD, è possibile utilizzare -newerBtal posto di -newermtper verificare l' ora di nascita dell'inode del file, se disponibile.


1
find /path/to/directory/ -mtime +<number of days> -name '<file name>' -exec rm -rf {} \;

esempio:

find /Netap_fileshare_backup/SQL/DB_backups/xeo/ -mtime +15 -name 'ORA_XEO*' -exec rm -rf {} \;

In questo caso rimuoverà tutti i file che iniziano con "ORA_XEO" con più di 15 giorni.


Sebbene sia meglio guardarlo con il rm -rf, il primo comando rimuoverà tutto ciò che è contenuto in tutte le directory più vecchie di quei 15 giorni. (Inoltre, perché tra parentesi -name?)
ilkkachu,

Hai ragione, non abbiamo bisogno di mettere "(" ")".
calafate,

ma se vogliamo aggiungere una condizione può essere utile. ad esempio se vogliamo rimuovere tutti i file che terminano con ".jar" o ".cp" e iniziamo con "ex". example.jar- verrà rimosso example.cp- verrà rimosso example.tar- non verrà rimosso
calafate

in questo caso possiamo usare:find /path/to/directory/ -mtime +<number of days> \( -name '*.jar' -o -name '*.cp' \) -name 'ex*' -exec rm -rf {} \;
calafate

Ciò rimuoverà alcuni file dal <numero di giorni> anziché da tutti i file più vecchi di <numero di giorni> a meno che non lo si esegua esattamente a mezzanotte e finisca entro un secondo. Con GNU finddovresti usare il -daystartmodificatore per forzare il -mtimevalore a mezzanotte.
roaima,
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.