Come eliminare i file più vecchi di X ore


191

Sto scrivendo uno script bash che deve eliminare i vecchi file.

Attualmente è implementato usando:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

Questo eliminerà i file più vecchi di 1 giorno.

Tuttavia, cosa succede se ho bisogno di una risoluzione più fine di quel giorno, diciamo come 6 ore? C'è un bel modo pulito per farlo, come se ci fosse usando find e -mtime?

Risposte:


303

Il vostro findhanno la -mminpossibilità? Ciò ti consente di testare il numero di minuti dall'ultima modifica:

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete

O forse guarda usando tmpwatchper fare lo stesso lavoro. phjr anche raccomandato tmpreapernei commenti.


2
L'uso di --mmin + X restituisce tutti i file con my find. Colpa mia per non aver verificato prima questo, ma questo comando ha appena cancellato la maggior parte della mia home directory. Per me, --mmin -X è l'argomento corretto.
Brandones,

tmpreaper è un fork di tmpwatch. È più sicuro ed esiste come pacchetto debian nella distro. Vantaggi rispetto a find -delete: tmpreaper non rimuoverà symlink, socket, fifos o file speciali
Nadir

Fai notare che $ REQUIRED_FILES deve essere racchiuso tra virgolette (virgolette doppie) e puoi usare un modello come: " .txt" per tutti i file .txt o file che iniziano con un modello come: "temp- " per eliminare tutti i file denominati con temp -
achasinh,

@PaulDixon come modificarlo in modo che $LOCATIONe $REQUIRED_FILESpossa avere entrambi valori multipli come dir1 dir2e *.txt *.tmp?
Enissay,

@Enissay $ LOCATION è una singola directory. Per più estensioni si sarebbe probabilmente desidera utilizzare un modello con -regex - vedi stackoverflow.com/questions/5249779/...
Paul Dixon

9

Puoi fare questo trucco: crea un file 1 ora fa e usa l' -newer fileargomento.

(O utilizzare touch -tper creare un tale file).


1
non esiste un interruttore più vecchio (almeno nel mio comando find), ed è quello che sarebbe necessario. -newer non aiuta.
iconoclasta,

puoi dare un comando touch che genererebbe un file vecchio di 1 ora che funzionerà su macchine che non possono usare -mmin? (Se sei su Linux, -mmin è disponibile, in caso contrario data e anche altri comandi sono deboli in confronto.)
iconoclast

2
@iconoclast touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) testCrea un file testche ha sempre 1 ora.
rovr138,

4

Ecco l'approccio che ha funzionato per me (e non vedo che viene utilizzato sopra)

$ find /path/to/the/folder -name *.* -mmin +59 -delete > /dev/null

eliminando tutti i file più vecchi di 59 minuti lasciando intatte le cartelle.


Meglio virgolette singole '*.*'o la shell lo espanderà ai nomi di file effettivi invece di tenerlo come jolly per la findrisoluzione. Ciò interrompe findl'operazione ricorsiva sui sottodir.
MestreLion,

Anche tenere a mente che -name '*.*'non sarà eliminare i file che non hanno estensione, ad esempio README, Makefilee così via
MestreLion

1

Per SunOS 5.10

 Example 6 Selecting a File Using 24-hour Mode


 The descriptions of -atime, -ctime, and -mtime use the  ter-
 minology n ``24-hour periods''. For example, a file accessed
 at 23:59 is selected by:


   example% find . -atime -1 -print




 at 00:01 the next day (less than 24 hours  later,  not  more
 than one day ago). The midnight boundary between days has no
 effect on the 24-hour calculation.

0

-mmin è per minuti.

Prova a guardare la pagina man.

man find

per più tipi.


0

Se non hai "-mmin" nella tua versione di "trova", allora "-mtime -0.041667" si avvicina molto a "entro l'ultima ora", quindi, nel tuo caso, usa:

-mtime +(X * 0.041667)

quindi, se X significa 6 ore, allora:

find . -mtime +0.25 -ls

funziona perché 24 ore * 0,25 = 6 ore


Era fiducioso perché questo vecchio UNIX non ha -mmin, ma, purtroppo, questo non è di aiuto poiché anche questo vecchio UNIX non ama i valori frazionari per mtime: find: l'argomento -mtime deve essere un numero intero compreso tra -2147483647 e 2147483647
kbulgrien

0

Ecco cosa si può fare per andare avanti nel modo in cui @iconoclast si chiedeva nel loro commento su un'altra risposta.

usa crontab per l'utente o /etc/crontabper creare un file /tmp/hour:

# m h dom mon dow user  command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1

e quindi usalo per eseguire il tuo comando:

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;

*/1perché ogni ora è ridondante nel tuo crontab. È lo stesso di mettere * nel campo dell'ora.
colm.anseo,

0

find $PATH -name $log_prefix"*"$log_ext -mmin +$num_mins -exec rm -f {} \;


0

Se uno findnon ha -mmine se anche uno è bloccato con un findche accetta solo valori interi -mtime, allora tutto non è necessariamente perso se si considera che "più vecchio di" è simile a "non più nuovo di".

Se siamo riusciti a creare un file che ha un tempo di interruzione, possiamo chiedere finddi individuare i file "non più recenti" del nostro file di riferimento.

Per creare un file che ha il corretto time stamp è un po 'coinvolta perché un sistema che non dispone di un adeguato findprobabilmente ha anche un meno-che-capace datedi comando che potrebbe fare cose come: date +%Y%m%d%H%M%S -d "6 hours ago".

Fortunatamente, altri vecchi strumenti che possono gestirlo, anche se in modo più ingombrante.

Considera che sei ore sono 21600 secondi. Vogliamo trovare il tempo che è sei ore fa in un formato utile:

$ date && perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57

L'istruzione perl ha prodotto una data utile, ma deve essere utilizzata meglio:

$ date && touch -t `perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", \
  $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file

Ora la soluzione per questo vecchio UNIX è qualcosa del tipo:

$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;

Potrebbe anche essere una buona idea ripulire il nostro file di riferimento ...

$ rm -f ref_file
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.