2013-02-06 14 views
80

Ich habe ein Protokolldateiverzeichnis mit 82000 Dateien und Verzeichnissen (etwa die Hälfte und die Hälfte).Wie lösche ich alle Dateien, die älter als 3 Tage sind, wenn "Argumentliste zu lang" ist?

Ich muss alle Dateien und Verzeichnisse löschen, die älter als 3 Tage sind.

In einem Verzeichnis, das 37.000 Dateien enthält, konnte ich dies tun mit:

find * -mtime +3 -exec rm {} \; 

Aber mit 82.000 Dateien/Verzeichnisse, erhalte ich die Fehlermeldung:

/usr/bin/find: Argument list too long

Wie kann ich diesen Fehler umgehen, sodass ich alle Dateien/Verzeichnisse löschen kann, die älter als 3 Tage sind?

find . -mtime +3 | xargs rm -Rf 

Oder alternativ, mehr im Einklang mit dem ursprünglichen Befehl des OP:

+1

Haben Sie 'find -mtime +3-exec rm {} +' versucht? –

+1

Ich glaube, dass 'find * -mtime +3 | xargs rm' das Problem lösen würde. –

+6

Ich denke, das einzige Problem ist 'find *'. 'finden .' ist besser. Die globale Shell erweitert das '*' zu einer riesigen Liste von Dateien und Verzeichnissen. –

Antwort

113

, um alle Dateien und Verzeichnisse innerhalb des aktuellen Verzeichnis zu löschen

find . -mtime +3 -exec rm -Rf -- {} \; 
+21

-1 Das Problem ist der Stern in "find *", Sie haben es mit "finden" gelöst. stattdessen. Xargs ist hier irreführend. –

+7

@AleksandrLevchuk löst es OP-Problem und verdient daher keinen Downvote – hd1

+9

Frage: "find * -mtime +3-exec rm {} \;" gibt die Argumentliste zu lang. Antwort: Benutze "find. -mtime +3-exec rm {} \;" –

53

auch verwenden:

find . -mindepth 1 -mtime +3 -delete 

Zielverzeichnis nicht löschen

+3

Beste Antwort, viel sauberer als Aufruf von rm (und wahrscheinlich sicherer). Funktioniert auch für Unterverzeichnisse. – basic6

10

Eine andere Lösung für die ursprüngliche Frage, insb. nützlich, wenn Sie nur einige der älteren Dateien in einem Ordner entfernen möchten, würde smth so aussehen:

find . -name "*.sess" -mtime +100 

und so weiter .. Zitate Shell Wildcards blockieren, so dass Sie Millionen von Dateien „finden“:)