Bash script per eliminare i file più vecchi di x giorni con le sottodirectory


37

Sto cercando di eliminare una tonnellata di file più vecchi di x giorni.

Ora ho una sceneggiatura per farlo

find /path/to/files* -mtime +10 -exec rm {} \; 

Ma questo eliminerà anche le sottodirectory. Ci sono un sacco di cartelle, ma vorrei conservarle ed eliminare i file più vecchi di 10 giorni all'interno di tali cartelle.

C'è un modo per fare questo?

Risposte:


50

type opzione per filtrare i risultati

findaccetta l' typeopzione per selezionare, ad esempio, solo i file.

find /path/to/files -type f -mtime +10 -delete

Lascia fuori -deleteper mostrare ciò che eliminerebbe e, una volta verificato, vai avanti ed esegui il comando completo.

Quello verrebbe eseguito solo su file, non su directory. Utilizzare -type dper il contrario, elencando solo le directory che corrispondono ai tuoi argomenti.


Opzioni aggiuntive

Potresti voler leggere man find, poiché ci sono alcune altre opzioni di cui potresti aver bisogno in futuro. Ad esempio, -maxdepthconsentirebbe di limitare gli elementi trovati solo a una profondità specifica, ad esempio -maxdepth 0non rientrerebbe nelle sottodirectory.

Alcune osservazioni

  • Mi chiedo come il comando avrebbe rimosso una cartella, poiché non è possibile rimuovere solo una cartella rm. Ne avresti bisogno rm -r.

  • Inoltre, /path/to/files*è confuso. Intendevi /path/to/files/o ti aspetti che il carattere jolly si espanda a diversi nomi di file e cartelle?

  • Inserisci le {}virgolette singole, cioè '{}'per evitare che il nome file / directory sostituito venga interpretato dalla shell, proprio come proteggiamo il punto e virgola con una barra rovesciata.


Bene ci sono molte cartelle all'interno di / path / to / files / in realtà vorrei eseguire il mtime +10 -exec rm in ciascuna di queste cartelle ma mantenere le cartelle stesse, in pratica vorrei ottenere è che eliminare tutte le file più vecchi di 10 giorni e conserva tutte le cartelle. Sono un principiante, mi dispiace per quel principiante :)
JoyIan Yee-Hernandez,

Bene, ecco qua :) Basta fare un find /path/to/files* -type f -mtime +10e vedere cosa avrebbe prodotto.
slhck,

Sì, in caso di dubbio, non fare il -exec, vedere solo quello che trova prima.
Rob,

2
@ JoyIanYee-Hernandez Puoi anche usare l' -deleteargomento per find, che cancella tutti i file e le cartelle, quest'ultimo solo se vuoto. Implica -depth, cioè una ricerca approfondita.
Daniel Beck

1
@Kreker Quindi è necessario aggiungere -mindepth 1per escludere la directory principale.
slhck,

5

Come nelle risposte precedenti (+1 per entrambi) il trucco è usare il -type fpredicato.

Nota che al posto di -exec rm '{}'te puoi anche usare -deletepredicato. Ma non farlo. Con -exec rm '{}'te puoi (e dovresti) prima fare -exec echo rm '{}'per verificare che questo è davvero quello che vuoi. Dopodiché riesegui il comando senza il echo.

L'uso -deleteè più veloce (nessun extra fork()e execve()per ogni file), ma questo è rischioso perché -deletefunziona anche come condizione, quindi:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

ma se scambiate SOLO argomenti:

# delete ALL files
find . -type f -name '*.tmp' -delete

Se hai bisogno finde rmper lavorare più velocemente per tonnellate di file, dai un'occhiata al find ... | xargs ... rmlinguaggio UNIX.


4
Penso che i tuoi ultimi due esempi siano esattamente gli stessi, potrebbe volerlo correggere!
slhck,

1

Puoi farlo facilmente con il comando find

$ find -type f

Il che limita i risultati al file di tipo


1

Stavo lottando per ottenere questo risultato usando gli script forniti sopra e alcuni altri script, specialmente quando i nomi di file e cartelle avevano una nuova riga o spazi.

Finalmente inciampato su tmpreaper e finora ha funzionato abbastanza bene per noi.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

Link alla fonte originale

Ha funzionalità come test, che controlla ricorsivamente le directory e le elenca. Possibilità di eliminare collegamenti simbolici, file o directory e anche la modalità di protezione per un determinato modello durante l'eliminazione


0

Per accelerare il comando utilizzare '+'invece di\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

Questo verrà eseguito rmsolo una volta alla fine anziché ogni volta che viene trovato un file.
( rmpuò essere eseguito più volte se hai davvero tonnellate di file a causa della limitazione della lunghezza della riga di comando, ma questo è ancora quasi veloce come l'utilizzo -delete)


0

rm -f find /path/to/files -type file -mtime -5

Ciò eliminerà i file che vengono modificati entro 5 giorni

rm -f find /path/to/files -type file -mtime +5

Ciò eliminerà i file modificati prima di 5 giorni

Usa `prima di trovare e alla fine dopo 5.

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.