Löschen Sie Dateien, die älter als X Tage sind

143

Ich habe den Befehl zum Löschen von Dateien gefunden, die älter als 5 Tage in einem Ordner sind

find /path/to/files* -mtime +5 -exec rm {} \;

Aber wie mache ich das auch für Unterverzeichnisse in diesem Ordner?

Teddy291
quelle
Meinen Sie Dateien in den Unterverzeichnissen? oder die Unterverzeichnisse selbst?
Rahul
3
find /path/to -type d -empty -delete
Costas
2
Löschen Sie Dateien in Unterverzeichnissen, die ebenfalls
älter als
3
Möglicherweise macht es Spaß, wenn ich Dateien mit Leerzeichen habe. ZB eine Datei namens "test one" und rm wird gefüttert rm test one. (Dadurch werden eine Datei mit dem Namen "test" und eine Datei mit dem Namen "one" gelöscht, jedoch keine Datei mit dem Namen "test one"). Tipp: -delete or -print0
Hennes
6
Zitieren Sie als Randnotiz immer das Argument vonfind , um Probleme mit Sonderzeichen zu vermeiden, wie in der ersten Zeile der Antwort angegeben. ZB:find /path/to/files/ -exec somecommand '{}' \;
Walf

Antworten:

240

Seien Sie vorsichtig mit speziellen Dateinamen (Leerzeichen, Anführungszeichen), wenn Sie an rm leiten.

Es gibt eine sichere Alternative - die Option -delete :

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

Das war's, kein separater RM-Aufruf, und Sie müssen sich keine Gedanken über Dateinamen machen.

Ersetzen Sie -deletemit -depth -print, um diesen Befehl zu testen, bevor Sie ihn ausführen ( -deleteimpliziert -depth).

basic6
quelle
23
Verwenden Sie -type fdiese Option auch, um nur Dateien zu löschen (und Unterverzeichnisse beizubehalten)
Oleg
3
Alternativ, wenn Sie das Gleiche für alle Dateien NEUER als fünf Tage tun möchten: find / path / to / directory / -mindepth 1 -mtime -5 -delete
zmonteca
Wenn mein Pfad Leerzeichen enthält, wie soll ich das tun? find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
Patrick Gregorio
3
@uom-pgregorio Ich würde vorschlagen, den Pfad in Anführungszeichen zu setzen.
Reife
4
Beachten Sie, dass jedes findArgument ein Filter ist, der das Ergebnis des vorherigen Filters als Eingabe verwendet. Stellen Sie also sicher, dass Sie -delete als letztes Argument hinzufügen. IE: find . -delete -mtime +5löscht ALLES im aktuellen Pfad.
Johan
15

Beachten Sie, dass dieser Befehl nicht funktioniert, wenn zu viele Dateien gefunden werden. Es wird ein Fehler wie folgt ausgegeben:

bash: /usr/bin/find: Argument list too long

Dies bedeutet, dass das Limit des Systemaufrufs exec für die Länge einer Befehlszeile überschritten wurde. Anstatt rm auf diese Weise auszuführen, ist es wesentlich effizienter, xargs zu verwenden . Hier ist ein Beispiel, das funktioniert:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

Dadurch werden alle Dateien (Typ f), die vor mehr als 14 Tagen unter / root / Maildir / rekursiv geändert wurden, entfernt (mindepth 1). Weitere Optionen finden Sie im Suchhandbuch .

Julius
quelle
7
Gehen Sie gemäß der Antwort von @ AfshinHamedi auf AskUbuntu ( askubuntu.com/questions/589210/removing-files-older-than-7-day ) vorsichtig mit Dateien um, die Zeilenumbrüche und Sonderzeichen enthalten. Verwenden find /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
Sie
2
Oder fügen Sie einfach '+' zu den
Suchergebnissen hinzu
8

Es ist das gleiche. Sie müssen nur das übergeordnete Verzeichnis und nicht das Präfix der Dateien angeben. In Ihrem Beispiel wäre es:

find /path/to -type f -mtime +5 -exec rm {} \;

Dadurch werden alle Dateien, die älter als 5 Tage sind, /path/tound ihre Unterverzeichnisse gelöscht .

Informationen zum Löschen leerer Unterverzeichnisse finden Sie in @Costas Kommentar oben.

apaul
quelle
4
Beachten Sie, dass Sie für jede einzelne Datei den Befehl rm ausführen. Wenn Sie 1000 Dateien haben, die älter als 5 Tage sind, wird rm 1000-mal gestartet. Aus diesem Grund sollten Sie die Option -delete wie in Costas Kommentar oder -exec rm {} \ +
Hennes
@ Hennes: - 1) nicht sicher, ob Sie +in diesem Fall entkommen müssen . - 2) Besser schreiben -exec rm '{}' +, um das Übel von Dateien mit Sonderzeichen (Leerzeichen, Zeilenumbrüche usw.) im Namen abzuwehren.
Cbhihe
-1
find . -mtime +3 -type f -not -name '*pid*' |xargs rm -rf
Susil
quelle