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
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
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