Wie lösche ich alle Dateien, die älter als 3 Tage sind, wenn die Argumentliste zu lang ist?

89

Ich habe ein Protokolldateiverzeichnis mit 82000 Dateien und Verzeichnissen (ungefähr die Hälfte und die Hälfte).

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

In einem Verzeichnis mit 37000 Dateien konnte ich dies tun mit:

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

Aber mit 82000 Dateien / Verzeichnissen erhalte ich den Fehler:

/ usr / bin / find: Argumentliste zu lang

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

Edward Tanguay
quelle
1
Hast du es versucht find -mtime +3 -exec rm {} +?
Gilles Quenot
1
Ich glaube, Laufen find * -mtime +3 |xargs rmwürde dieses Problem lösen.
Mats Petersson
9
Ich denke das einzige Problem ist find *. find .ist besser. Das Shell-Globing erweitert das *auf eine riesige Liste von Dateien und Verzeichnissen.
Kunstloser Lärm
@artlessnoise ist genau richtig.
Sjas

Antworten:

120

So löschen Sie alle Dateien und Verzeichnisse im aktuellen Verzeichnis:

find . -mtime +3 | xargs rm -Rf

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

find . -mtime +3 -exec rm -Rf -- {} \;
hd1
quelle
26
-1 Das Problem ist der Stern in "find *". Sie haben es mit "find" gelöst. stattdessen. Xargs ist hier irreführend.
Aleksandr Levchuk
7
@AleksandrLevchuk es löst OPs Problem, und deshalb keinen downvote verdient
HD1
11
Frage: "find * -mtime +3 -exec rm {} \;" gibt die Argumentliste zu lang. Antwort: Verwenden Sie "find. -Mtime +3 -exec rm {} \;"
Aleksandr Levchuk
2
Vielleicht möchten Sie --nach rm hinzufügen , wiefind . -mtime +3 -exec rm -- {} \;
Domen
8
Niemand hat gesagt, wofür das --ist.
Acumenus
59

Kann auch verwenden:

find . -mindepth 1 -mtime +3 -delete

Zielverzeichnis nicht löschen

vangheem
quelle
4
Beste Antwort, viel sauberer als rm anzurufen (und wahrscheinlich sicherer). Funktioniert auch für Unterverzeichnisse.
basic6
15

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äre Folgendes:

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

und so weiter .. Zitate blockieren Shell-Platzhalter, sodass Sie Millionen von Dateien "finden" können :)

62mkv
quelle