ho directory denominate come:script di shell per eliminare le directory di età superiore a n giorni
2012-12-12
2012-10-12
2012-08-08
Come potrei eliminare le directory che sono più vecchi di 10 giorni con uno script di shell bash?
ho directory denominate come:script di shell per eliminare le directory di età superiore a n giorni
2012-12-12
2012-10-12
2012-08-08
Come potrei eliminare le directory che sono più vecchi di 10 giorni con uno script di shell bash?
Questo farà in modo ricorsivo per voi:
find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \;
Spiegazione:
find
: il comando unix per la ricerca di file/directory/link ecc/path/to/base/dir
: la directory per iniziare la ricerca.-type d
: solo f directory ind-ctime +10
: considerano solo quelli con data di modifica più di 10 giorni-exec ... \;
: per ogni tale risultato trovato, fare il seguente comando in ...
rm -rf {}
: ricorsivamente forzare rimuovere la directory; la parte {}
è dove il risultato di ricerca viene sostituito dalla parte precedente.In alternativa, l'uso:
find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf
Che è un po 'più efficiente, perché equivale a:
rm -rf dir1 dir2 dir3 ...
in contrapposizione a:
rm -rf dir1; rm -rf dir2; rm -rf dir3; ...
come nel metodo -exec
.
Nota: Vedere anche il commento di MarkReed in basso relativo all'uso preferenziale con la versione moderna di find
.
Con le versioni moderne di 'find' puoi sostituire'; 'con' + 'e farà l'equivalente della chiamata' xargs' per te, passando il numero di file che si adatta ad ogni chiamata di sistema 'exec':' trova . -type d -ctime +10 -exec rm -rf {} + ' –
Grazie a tutti e due. Posso passare in qualche modo la directory genitore nel comando. – bobsr
@bobsr Visualizza risposta aggiornata: la directory di base per avviare la ricerca viene specificata come primo argomento dopo 'find'. –
Se si desidera eliminare tutte le sottodirectory sotto /path/to/base
, ad esempio
/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3
ma non si desidera eliminare alla radice /path/to/base
, è necessario aggiungere -mindepth 1
e -maxdepth 1
opzioni, che accederanno solo le sottodirectory sotto /path/to/base
-mindepth 1
esclude la radice /path/to/base
dalle partite.
-maxdepth 1
sarà SOLO sottodirectory partita immediatamente sotto /path/to/base
come /path/to/base/dir1
, /path/to/base/dir2
e /path/to/base/dir3
ma sarà senza elencare le sottodirectory di questi in modo ricorsivo.Quindi queste sottodirectory di esempio non verranno elencate:
/path/to/base/dir1/dir1
/path/to/base/dir2/dir1
/path/to/base/dir3/dir1
e così via.
Quindi, per eliminare tutte le sottodirectory sotto /path/to/base
che hanno più di 10 giorni;
find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf
ho faticato per ottenere questo diritto utilizzando gli script forniti in precedenza e alcuni altri script soprattutto quando i file e nomi di cartella avevano a capo o gli spazi.
Finalmente inciampato su tmpreaper ed è stato funzionato abbastanza bene per noi finora.
tmpreaper -t 5d ~/Downloads
tmpreaper --protect '*.c' -t 5h ~/my_prg
Fonte Originale link
ha caratteristiche come test, che verifica le directory in modo ricorsivo e li elenca. Possibilità di eliminare i link simbolici file o directory e anche la modalità di protezione per un determinato modello durante l'eliminazione
O
rm -rf `find /path/to/base/dir/* -type d -mtime +10`
aggiornato, versione più veloce di esso:
find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f
Questo potrebbe facilmente superare la lunghezza massima della riga di comando. Vedi 'xargs --show-limits'. –
Inoltre, non funzionerà se ci sono nomi di file contenenti spazi o altri caratteri speciali della shell. – Carpetsmoker
@Carpetsmoker Non '-print0' /' -0' si prende cura dei caratteri speciali della shell, o no? – mpen
find
supporta -delete
operazione , quindi:
find /base/dir/* -ctime +10 -delete;
Penso che ci sia un problema nel fatto che i file devono essere anche più vecchi di 10+ giorni. Non ho provato, qualcuno potrebbe confermare nei commenti.
La soluzione più votata qui manca -maxdepth 0
quindi chiamerà rm -rf
per ogni sottodirectory, dopo averlo eliminato. Questo non ha senso, quindi suggerisco:
find /base/dir/* -maxdepth 0 -type d -ctime +10 -exec rm -rf {} \;
La soluzione -delete
di cui sopra non fa uso di -maxdepth 0
perché find
si lamenterebbe il dir non sia vuota. Invece, implica -depth
ed elimina dal basso verso l'alto.
Posso confermare che '-delete' funziona, ma come hai detto tu puoi usarlo solo per cancellare le directory vuote, proprio come' rmdir'. – CTodea
Per non avere alcuna relazione sul loro effettivo tempo di creazione/modifica? Perché 'find' potrebbe farlo senza guardare il nome quindi ... – Wrikken
dovrebbero avere anche tempo di creazione/modifica su di loro – bobsr
Cosa intendi per" più vecchio di "? Ti riferisci al tempo in cui la directory è stata creata, al momento in cui il suo contenuto è stato modificato per l'ultima volta, o qualcos'altro? Fai attenzione con alcune delle risposte qui sotto; 'ctime' è il tempo di cambio dell'inode. Per una directory, cambia quando i file vengono aggiunti o rimossi dalla directory. – ajk