Dateien, die älter als 30 Tage sind, werden ordnungsgemäß gelöscht

8

Ich habe einen Cache-Ordner mit mindestens 15000 Dateien.

Ich habe es versucht:

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

Aber das ließ meine Serverlast in den Himmel fliegen!

Gibt es eine schnellere / bessere Lösung?

Oder kann ich die Geschwindigkeit oder Iterationen dieses Befehls begrenzen ?

Kristian
quelle
1
Wenn es cache*auf viele Dateien erweitert wird, können Sie find . -name 'cache*' -mtime +30 -exec rm {} \;stattdessen etwas Ähnliches ausprobieren .
Jaap Eldering

Antworten:

10

Ich benutze es gerne tmpwatchfür diese Dinge, dies ist das letzte Mal, dass die Datei geändert wurde. Es ist einfach und funktioniert in vielen Fällen gut:

tmpwatch -m 720 /path/to/cache

Überprüfen Sie tmpreaperstattdessen Ubuntu .

Wenn Sie überprüfen möchten, wann das letzte Mal auf die Datei zugegriffen wurde, verwenden Sie Folgendes:

tmpwatch -a 720 /path/to/cache

Sie können tmpwatch -a nicht auf Dateisystemen verwenden, die mit noatime gemountet wurden. Sie können immer noch -m verwenden

WojonsTech
quelle
Ich benutze Ubuntu 10.04.2 LTSund dieser Befehl existiert nicht ..
Kristian
2
@Kristian tmpreaperStattdessen nach suchen .
Slhck
Gibt es Fallstricke bei der Verwendung dieser zur Verwaltung von Dateisystemen, die mit der Option noatime bereitgestellt wurden?
AnonymousLurker
@ AnonymousLurker Ich habe die Antwort für Sie
geändert
6

Sie können das Laichen eines neuen Prozesses für jede Datei mithilfe von vermeiden

find cache* -mtime +30 -delete
Chiborg
quelle
3

Versuchen Sie, das oben genannte mit nice auszuführen:

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

Auf diese Weise wird die enorme Last nur angezeigt, wenn nichts anderes ausgeführt werden muss, andernfalls haben die anderen Prozesse Vorrang (wenn ihre Schönheit unter 19 liegt, dh maximal).

Beachten Sie, dass das Argument zur Option -n zu der Standard-Nizza hinzugefügt wird, die zwischen -20 und 19 variiert. Ich habe 39 verwendet, damit es sehr schön ist, unabhängig davon, welche ursprüngliche Nizza vorhanden war.

Daniel Fetchinson
quelle
2

Wie von chiborg kommentiert, ist das Laden darauf zurückzuführen, dass rm für jede gefundene Datei gestartet wird. Ich bemerkte die Antwort, wo tmpwatchals Alternative vorgeschlagen wird, was sicher gut funktioniert. Dies ist jedoch nicht erforderlich.

Find kann den Befehl, der an exec gegeben wurde, einmal ausführen, wenn Sie ihn anweisen, die gefundenen Dateien in einer Liste von Argumenten wie folgt zu akkumulieren:

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

Dies funktioniert manchmal nicht, da die Argumentliste möglicherweise größer (in Byte) wird als das von der Shell zugelassene Maximum (getconf ARG_MAX). Dies kann durch xargs mit der Option -L gelöst werden.

Betrachten Sie dieses Beispiel:

$ 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

Sie müssen also keine zusätzliche Software installieren. Sie benötigen lediglich gnu-findutils:

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 
Ярослав Рахматуллин
quelle
Einige d00d hielten es für nützlich, -print0 und -0 hinzuzufügen, um und xargs zu finden. Diese Argumente erzwingen, dass ihre Befehle das Nullzeichen (\ 0) anstelle einer neuen Zeile (\ n) verwenden, um die Argumente zu trennen. Dies ist hilfreich, wenn der Dateiname Leerzeichen oder neue Zeilen enthält.
Ярослав Рахматуллин
(1) Sie brauchen nicht zu sagen \+; schlicht +ist gut genug. (2) Dies wird nicht "nicht funktionieren, weil die Argumentliste möglicherweise groß wird ...".  find  … -exec … {} +wird das gleiche tun, was xargstun wird; Der Befehl wird so oft ausgeführt, wie es erforderlich ist. Wenn Sie beispielsweise (wie in Ihrem Beispiel) zwischen 15001 und 20000 Dateien haben, findwird das -execProgramm 'd ( rm) viermal ausgeführt.
G-Man sagt "Reinstate Monica"