Eliminazione con grazia di file di età superiore a 30 giorni


8

Ho una cartella cache con un minimo di 15000 file.

Ho provato questo:

find cache* -mtime +30 -exec rm {} \;

Ma questo ha fatto volare il mio server verso il cielo!

Esiste una soluzione più veloce / migliore ?

O posso limitare la velocità o le iterazioni di questo comando?


1
Se si cache*espande in molti file, ti consigliamo di provare qualcosa di simile find . -name 'cache*' -mtime +30 -exec rm {} \;.
Jaap Eldering,

Risposte:


10

Mi piace usare tmpwatchper queste cose, questa è l'ultima volta che il file è stato modificato. È semplice e funziona bene in molti casi:

tmpwatch -m 720 /path/to/cache

Per Ubuntu, controlla tmpreaperinvece.

Se si desidera verificare l'ultima volta che è stato effettuato l'accesso al file, utilizzare quanto segue:

tmpwatch -a 720 /path/to/cache

Non è possibile utilizzare tmpwatch -a su file system montati con noatime. puoi ancora usare -m


Sto usando Ubuntu 10.04.2 LTSe quel comando non esiste ..
Kristian,

2
@Kristian Controlla tmpreaperinvece.
slhck,

Qualche insidia quando si usano questi per gestire i filesystem montati con l'opzione noatime?
AnonymousLurker,

@AnonymousLurker Ho modificato la risposta per te
WojonsTech,

6

È possibile evitare la generazione di un nuovo processo per ciascun file utilizzando

find cache* -mtime +30 -delete

3

Prova a eseguire quanto sopra con nice:

nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'

In questo modo il carico enorme apparirà solo se non è necessario eseguire nient'altro, altrimenti gli altri processi avranno la precedenza (se la loro gentilezza è inferiore a 19, cioè il massimo).

Si noti che l'argomento dell'opzione -n ​​viene aggiunto alla gentilezza predefinita che varia tra -20 e 19. Ho usato 39 in modo che sia molto bello indipendentemente dalla gentilezza originale che c'era.


2

Come commentato da chiborg, il caricamento è dovuto all'avvio di rm per ogni file trovato. Ho notato la risposta in cui tmpwatchviene suggerita un'alternativa, che sono sicuro che funziona bene. Tuttavia, non è necessario.

Trova può eseguire il comando dato a exec una volta, se gli dici di accumulare i file trovati in un elenco di argomenti in questo modo:

find /path -name "*.moo" -exec rm {} \+

Questo a volte potrebbe non funzionare perché l'elenco degli argomenti potrebbe diventare più grande (in byte) del massimo consentito dalla shell (getconf ARG_MAX). Questo può essere risolto da xargs con l'opzione -L.

considera questo esempio:

$ echo 0 > /tmp/it; 
$ for i in {0..15000};do echo $i;done  |\
    xargs --no-run-if-empty -L 5000 ./tmp/xr.sh 
Iteration=0; running with 5000 arguments
Iteration=1; running with 5000 arguments
Iteration=2; running with 5000 arguments
Iteration=3; running with 1 arguments

$ cat tmp/xr.sh 
#!/bin/sh
IT=`cat /tmp/it`
echo Iteration=$IT\; running with $# arguments
let IT=IT+1
echo $IT > /tmp/it

Quindi non è necessario installare software extra, tutto ciò che serve è in gnu-findutils:

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 

alcuni d00d hanno pensato che sarebbe stato utile aggiungere -print0 e -0 per trovare e xargs. Tali argomenti obbligano i loro comandi a utilizzare il carattere null (\ 0) anziché una nuova riga (\ n) per separare gli argomenti. Questo è utile quando il nome del file contiene spazi o nuove righe.
Ярослав Рахматуллин

(1) Non è necessario dirlo \+; la pianura +è abbastanza buona. (2) Questo non "non funzionerà perché l'elenco degli argomenti potrebbe ingrandirsi ...".  find  … -exec … {} +farà la stessa cosa che xargsfarà; eseguirà il comando tutte le volte che è necessario. Ad esempio (come nel tuo esempio), se hai tra 15001 e 20000 file, findeseguiresti il -execprogramma 'd ( rm) quattro volte.
G-Man dice "Ripristina Monica" il
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.