Frage Bash-Skript zum Löschen von Dateien älter als x Tage mit Unterverzeichnissen


Ich versuche, eine Tonne Dateien zu löschen, die älter als x Tage sind.

Jetzt habe ich ein Skript, um das zu tun

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

Dadurch werden jedoch auch die Unterverzeichnisse gelöscht. Es gibt eine Menge Ordner, aber ich möchte sie behalten und die Dateien löschen, die älter als 10 Tage in den genannten Ordnern sind.

Gibt es eine Möglichkeit, dies zu tun?


36
2018-01-05 16:18


Ursprung




Antworten:


type Option zum Filtern von Ergebnissen

find akzeptiert die type Option zum Auswählen von beispielsweise nur Dateien.

find /path/to/files -type f -mtime +10 -delete

Auslassen -delete um zu zeigen, was es löschen würde, und sobald Sie dies überprüft haben, fahren Sie fort und führen Sie den vollständigen Befehl aus.

Das würde nur auf Dateien, nicht auf Verzeichnissen laufen. Benutzen -type d Für die Umkehrung, nur Verzeichnisse auflisten, die Ihren Argumenten entsprechen.


Zusatzoptionen

Vielleicht möchtest du lesen man find, da es in der Zukunft noch weitere Optionen geben könnte. Beispielsweise, -maxdepth würde es Ihnen erlauben, die gefundenen Gegenstände nur auf eine bestimmte Tiefe zu beschränken, z.B. -maxdepth 0 würde nicht in Unterverzeichnisse zurückkehren.

Einige Bemerkungen

  • Ich frage mich, wie der Befehl einen Ordner entfernt haben würde, da Sie einen Ordner nicht mit entfernen können rm nur. Du würdest brauchen rm -r dafür.

  • Ebenfalls, /path/to/files* ist verwirrend. Hast du gemeint /path/to/files/ Oder erwarten Sie, dass der Platzhalter auf mehrere Datei- und Ordnernamen erweitert wird?

  • Lege das {} in einfachen Anführungszeichen, d.h. '{}' um zu vermeiden, dass der Name der ersetzten Datei / des Verzeichnisses von der Shell interpretiert wird, genauso wie wir das Semikolon mit einem Backslash schützen.


50
2018-01-05 16:23



Nun, es gibt eine Menge Ordner in / path / to / files / eigentlich würde ich gerne die mtime +10 -exec rm zu jedem dieser Ordner laufen lassen, aber die Ordner selbst behalten, grundsätzlich möchte ich erreichen, dass das alles gelöscht wird Dateien älter als 10 Tage und behalten Sie alle Ordner. Ich bin ein Newb entschuldigen Sie diese Newbness :) - JoyIan Yee-Hernandez
Nun, da gehst du :) Mach einfach einen find /path/to/files* -type f -mtime +10 und sehen, was es ausgeben würde. - slhck
Ja, im Zweifelsfall mach das nicht -execschau einfach, was es zuerst findet. - Rob
@ JoyIanYee-Hernandez Sie können auch die -delete Argument zu find, die alle Dateien und Ordner löscht, letzteres nur, wenn es leer ist. Es impliziert -depth, d.h. Tiefensuche zuerst. - Daniel Beck♦
@Kreker Dann müssen Sie hinzufügen -mindepth 1 um das übergeordnete Verzeichnis auszuschließen. - slhck


Wie in vorherigen Antworten (+1 für beide) ist der Trick zu verwenden -type f Prädikat.

Beachten Sie, dass statt -exec rm '{}' Sie können auch verwenden -delete Prädikat. Aber tu das nicht. Mit -exec rm '{}' Sie können (und sollten) zuerst tun -exec echo rm '{}' um zu überprüfen, dass dies wirklich das ist, was du willst. Danach führen Sie den Befehl ohne den Befehl erneut aus echo.

Verwenden -delete ist schneller (kein extra fork() und execve() für jede Datei), aber das ist riskant, weil -delete funktioniert auch als Bedingung, also:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

aber wenn Sie nur Argumente austauschen:

# delete ALL files
find . -type f -name '*.tmp' -delete

Wenn Sie jemals brauchen find und rm um für Tonnen von Dateien schneller zu arbeiten, schauen Sie sich die find ... | xargs ... rm UNIX-Idiom.


5
2018-01-05 17:33



Ich denke deine letzten beiden Beispiele sind genau die gleichen, vielleicht möchtest du das korrigieren! - slhck


Sie können dies einfach mit dem Befehl find tun

$ find -type f

Dies beschränkt die Ergebnisse auf den Dateityp


1
2018-01-05 16:23





Ich hatte Mühe, dies richtig zu machen, indem ich die oben genannten Skripte und einige andere Skripte einsetzte, insbesondere wenn Dateien und Ordnernamen Zeilenumbrüche oder Leerzeichen enthielten.

Endlich stolperte man über tmpreaper und es hat sich für uns bisher ziemlich gut bewährt.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

Originalquelle Verknüpfung 

Hat Funktionen wie test, die die Verzeichnisse rekursiv prüft und auflistet. Möglichkeit zum Löschen von Symlinks, Dateien oder Verzeichnissen und auch des Schutzmodus für ein bestimmtes Muster beim Löschen


1
2018-02-20 11:26





Um den Befehl zu beschleunigen '+' Anstatt von \;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

Dies wird ausgeführt rm nur einmal am Ende statt jedes Mal, wenn eine Datei gefunden wird.
(rm kann mehrere Male ausgeführt werden, wenn Sie wirklich Tonnen von Dateien wegen der Begrenzung der Befehlszeilenlänge haben, aber das ist immer noch fast so schnell wie die Verwendung -delete)


0
2018-01-05 17:56





rm -f find /path/to/files -type file -mtime -5

Dadurch werden die Dateien gelöscht, die innerhalb von 5 Tagen geändert wurden

rm -f find /path/to/files -type file -mtime +5

Dadurch werden die Dateien gelöscht, die vor 5 Tagen geändert wurden

Verwenden Sie `vorher finden und am Ende nach 5.


0
2017-09-30 09:49