2012-12-13 13 views
110

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?

+0

Per non avere alcuna relazione sul loro effettivo tempo di creazione/modifica? Perché 'find' potrebbe farlo senza guardare il nome quindi ... – Wrikken

+0

dovrebbero avere anche tempo di creazione/modifica su di loro – bobsr

+3

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

risposta

262

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.

+29

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 {} + ' –

+0

Grazie a tutti e due. Posso passare in qualche modo la directory genitore nel comando. – bobsr

+0

@bobsr Visualizza risposta aggiornata: la directory di base per avviare la ricerca viene specificata come primo argomento dopo 'find'. –

26

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 
3

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

0

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 
+1

Questo potrebbe facilmente superare la lunghezza massima della riga di comando. Vedi 'xargs --show-limits'. –

+1

Inoltre, non funzionerà se ci sono nomi di file contenenti spazi o altri caratteri speciali della shell. – Carpetsmoker

+0

@Carpetsmoker Non '-print0' /' -0' si prende cura dei caratteri speciali della shell, o no? – mpen

8

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.

+0

Posso confermare che '-delete' funziona, ma come hai detto tu puoi usarlo solo per cancellare le directory vuote, proprio come' rmdir'. – CTodea

Problemi correlati