Script della shell per eliminare le directory più vecchie di n giorni


165

Ho directory denominate come:

2012-12-12
2012-10-12
2012-08-08

Come eliminerei le directory più vecchie di 10 giorni con uno script bash shell?


1
Hanno scoperto qualche relazione sul loro tempo reale di creazione / modifica? Perché findpotrebbe farlo senza guardare il nome quindi ...
Wrikken,

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

4
Cosa intendi con "più vecchio di"? Ti riferisci all'ora in cui è stata creata la directory, all'ultima modifica del suo contenuto o qualcos'altro? Fai attenzione con alcune delle risposte seguenti; ctimeè il tempo di cambio dell'inode. Per una directory, cambia quando i file vengono aggiunti o rimossi dalla directory.
aprile

Risposte:


390

Questo lo farà in modo ricorsivo per te:

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \;

Spiegazione:

  • find: il comando unix per trovare file / directory / collegamenti ecc.
  • /path/to/base/dir: la directory in cui iniziare la ricerca.
  • -type d: trova solo le directory
  • -ctime +10: considera solo quelli con tempi di modifica più vecchi di 10 giorni
  • -exec ... \;: per ciascuno di questi risultati trovati, esegui il seguente comando in ...
  • rm -rf {}: forzatamente ricorsivamente rimuove la directory; la {}parte è dove viene sostituito il risultato della ricerca dalla parte precedente.

In alternativa, utilizzare:

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 ...

al contrario di:

rm -rf dir1; rm -rf dir2; rm -rf dir3; ...

come nel -execmetodo.


Con le versioni moderne di find, è possibile sostituire il ;con +e farà l'equivalente della xargschiamata per te, passando tutti i file che si adattano a ogni chiamata di sistema exec:

find . -type d -ctime +10 -exec rm -rf {} +

12
-mtimeera meglio per me in quanto controlla le modifiche dei contenuti piuttosto che le modifiche alle autorizzazioni, altrimenti è stato perfetto.
cambio rapido

7
penso che questo cancellerà anche la directory base stessa
O Gal

3
@OrGal hai assolutamente ragione. Al fine di evitare questo, basta usare: find /path/to/base/dir/*.
Zloynemec,

11
puoi usare -maxdepth 1 per ignorare il contenuto delle directory
Sam

7
L'approccio più efficiente può ritorcersi contro se ci sono troppe cartelle da eliminare: stackoverflow.com/questions/11289551/… . Per lo stesso motivo, per evitare la cancellazione della cartella di base è meglio usare -mindepth 1(piuttosto che /path/to/folder/*).
Ohad Schneider,

41

Se si desidera eliminare tutte le sottodirectory in /path/to/base, ad esempio

/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3

ma non vuoi cancellare il root /path/to/base, devi aggiungere -mindepth 1e le -maxdepth 1opzioni, che accederanno solo alle sottodirectory sotto/path/to/base

-mindepth 1esclude la radice /path/to/basedalle corrispondenze.

-maxdepth 1sarà SOLO abbinare sottodirectory immediatamente sotto /path/to/base, come /path/to/base/dir1, /path/to/base/dir2e /path/to/base/dir3ma non sarà Lista 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 in /path/to/basecui sono più vecchi di 10 giorni;

find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf

19

findsupporta il -deletefunzionamento, quindi:

find /base/dir/* -ctime +10 -delete;

Penso che ci sia un problema per cui anche i file devono avere più di 10 giorni. Non ci ho provato, qualcuno potrebbe confermare nei commenti.

La soluzione più votata qui manca, -maxdepth 0quindi chiamerà rm -rfper ogni sottodirectory, dopo averla eliminata. Non ha senso, quindi suggerisco:

find /base/dir/* -maxdepth 0  -type d -ctime +10 -exec rm -rf {} \;

La -deletesoluzione sopra non utilizza -maxdepth 0perché findsi lamenterebbe che la directory non è vuota. Invece, implica -depthed elimina dal basso verso l'alto.


Posso confermare i -deletelavori, ma come hai detto, puoi usarlo solo per eliminare le directory vuote, molto simile rmdir.
CTodea,

3

Stavo lottando per ottenere questo risultato usando gli script forniti sopra e alcuni altri script soprattutto 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


2

O

rm -rf `find /path/to/base/dir/* -type d -mtime +10`

Versione aggiornata e più veloce di esso:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f

2
Questo potrebbe facilmente superare la lunghezza massima della riga di comando. Vedere xargs --show-limits.
Michael Krupp,

2
Inoltre non funzionerà se ci sono nomi di file contenenti spazi o altri caratteri shell speciali.
Martin Tournoij,

@Carpetsmoker Il -print0/ non -0si occupa dei caratteri shell speciali o no?
mpen

Hai ragione sul fatto che la xargsversione sarà @mpen, ma la prima riga no.
Martin Tournoij,
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.