Come trovare ed eliminare file più vecchi di determinati giorni in unix?


38

Ho una cartella per il registro con 7 cartelle al suo interno. Anche quelle sette cartelle hanno sottocartelle e anche quelle sottocartelle. Voglio eliminare tutti i file più vecchi di 15 giorni in tutte le cartelle comprese le sottocartelle senza toccare la struttura delle cartelle, ciò significa solo i file.

mahesh@inl00720:/var/dtpdev/tmp/ > ls
A1  A2  A3  A4  A5  A6  A7

mahesh@inl00720:/var/dtpdev/tmp/A1/ > ls
B1 B2 B3 B4 file1.txt file2.csv

Risposte:


54

Potresti iniziare dicendo find /var/dtpdev/tmp/ -type f -mtime +15. Questo troverà tutti i file più vecchi di 15 giorni e stampa i loro nomi. Facoltativamente, è possibile specificare -printalla fine del comando, ma questa è l'azione predefinita. Si consiglia di eseguire prima il comando sopra per vedere quali file sono selezionati.

Dopo aver verificato che il findcomando elenca i file che si desidera eliminare (e nessun altro), è possibile aggiungere una "azione" per eliminare i file. Le azioni tipiche per fare questo sono:

  1. -exec rm -f {} \;(o, equivalentemente, -exec rm -f {} ';')
    Questo verrà eseguito rm -fsu ciascun file; per esempio,

    rm -f /var/dtpdev/tmp/A1/B1; rm -f /var/dtpdev/tmp/A1/B2; rm -f /var/dtpdev/tmp/A1/B3; …
    
  2. -exec rm -f {} +
    Questo verrà eseguito rm -fsu più file contemporaneamente; per esempio,

    rm -f /var/dtpdev/tmp/A1/B1 /var/dtpdev/tmp/A1/B2 /var/dtpdev/tmp/A1/B3 …
    

    quindi potrebbe essere leggermente più veloce dell'opzione 1. (Potrebbe essere necessario eseguire rm -falcune volte se si dispone di migliaia di file.)

  3. -delete
    Questo si dice finddi eliminare i file, senza eseguire rm. Questo potrebbe essere infinitamente più veloce delle -execvarianti, ma non funzionerà su tutti i sistemi.

Quindi, se usi l'opzione 2, l'intero comando sarebbe:

find /var/dtpdev/tmp/ -type f -mtime +15 -exec rm -f {} +

L'uso di -delete è più semplice (sintassi e nessun processo figlio generato per eliminare) ma potrebbe non funzionare su tutti i sistemi. rm -f {} + è il migliore, eliminerà i file in batch se ci sono abbastanza file da essere troppo per una riga di comando. rm -f {} ';' darà un comando di errore troppo lungo se ci sono abbastanza file per essere troppo per una riga di comando.
martedì

-1

O fallo con un ciclo:

for x in $(find /var/dtpdev/tmp/ -type f -mtime +15); do rm "$x"; done

Questo non funzionerà con file con spazi al loro interno.
Drav Sloan,

Puoi invece usare un ciclo while che dovrebbe occuparsi dei file con spazi. find / var / dtpdev / tmp / -type f -mtime +15 | mentre leggi x; fare rm "$ x"; fatto
David Okwii il
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.