Elimina i file più vecchi di X giorni +


143

Ho trovato il comando per eliminare i file più vecchi di 5 giorni in una cartella

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

Ma come faccio anche per le sottodirectory in quella cartella?


Intendi i file all'interno delle sottodirectory? o le stesse sottodirectory?
rahul,

3
find /path/to -type d -empty -delete
Costas,

2
Elimina i file nelle sottodirectory che hanno anche più di 5 giorni
Teddy291

3
Forse divertente quando ho file con spazi. Ad esempio un file chiamato "test one" e rm viene alimentato rm test one. (Che eliminerà un file chiamato "test" e un file chiamato "one", ma non un file chiamato "test one"). Suggerimento: -delete o -print0
Hennes

6
Come nota a margine, cita sempre l'argomento fornito dafind per evitare problemi con caratteri speciali, come indicato nella prima riga della risposta. Ad esempio:find /path/to/files/ -exec somecommand '{}' \;
Walf,

Risposte:


240

Fai attenzione con i nomi di file speciali (spazi, virgolette) quando esegui il piping su rm.

C'è un'alternativa sicura: l' opzione -delete :

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

Ecco fatto, nessuna chiamata rm separata e non devi preoccuparti dei nomi dei file.

Sostituisci -deletecon -depth -printper testare questo comando prima di eseguirlo ( -deleteimplica -depth).


23
Utilizzare anche -type fper eliminare solo i file (e mantenere le sottodirectory)
Oleg

3
In alternativa, se vuoi fare lo stesso per tutti i file PIÙ RECENTI di cinque giorni: find / path / to / directory / -mindepth 1 -mtime -5 -delete
zmonteca

Se il mio percorso contiene spazi, come devo fare? find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
Patrick Gregorio,

3
@ uom-pgregorio Suggerirei di inserire il percorso tra virgolette.
atripes

4
Si noti che ogni findargomento è un filtro che utilizza il risultato del filtro precedente come input. Quindi assicurati di aggiungere -delete come ultimo argomento. IE: find . -delete -mtime +5cancellerà TUTTO nel percorso corrente.
Johan

15

Si noti che questo comando non funzionerà quando trova troppi file. Produrrà un errore come:

bash: /usr/bin/find: Argument list too long

Ciò significa che è stato superato il limite della chiamata di sistema exec sulla lunghezza di una riga comandi. Invece di eseguire rm in questo modo è molto più efficiente usare xargs . Ecco un esempio che funziona:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

Questo rimuoverà tutti i file (tipo f) modificati più di 14 giorni fa in / root / Maildir / ricorsivamente da lì e più in profondità (mindepth 1). Vedere il manuale di ricerca per ulteriori opzioni .


7
Per la risposta di @ AfshinHamedi su AskUbuntu ( askubuntu.com/questions/589210/removing-files-older-than-7-day ), fai attenzione ai file che contengono nuove righe e caratteri speciali. Invece usafind /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
Cbhihe il

2
Oppure aggiungi "+" ai risultati della ricerca
Dani_l

8

È lo stesso. Devi solo fornire la directory principale anziché il prefisso dei file. Nel tuo esempio, sarebbe:

find /path/to -type f -mtime +5 -exec rm {} \;

Questo eliminerà tutti i file più vecchi di 5 giorni che sono sotto /path/toe le sue sottodirectory.

Per eliminare sottodirectory vuote, fare riferimento al commento @Costas sopra.


4
Nota che per ogni singolo file eseguirai il comando rm. Se hai 1000 file più vecchi di 5 giorni, allora rm inizierà 1000 volte. Per questo motivo considera l'opzione -delete come nel commento di Costa o -exec rm {} \ +
Hennes

@Hennes: - 1) non sono sicuro di dover scappare +in quel caso. - 2) meglio scrivere -exec rm '{}' +per respingere il male dei file con caratteri speciali (spazi, righe, ecc ...) nel loro nome.
Cbhihe,

-1
find . -mtime +3 -type f -not -name '*pid*' |xargs rm -rf
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.