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

37

Ich versuche, eine Tonne von 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, die älter als 10 Tage sind, in diesen Ordnern löschen.

Gibt es eine Möglichkeit, dies zu tun?

JoyIan Yee-Hernandez
quelle

Antworten:

50

type Option zum Filtern der Ergebnisse

findAkzeptiert die typeOption, zum Beispiel nur Dateien auszuwählen.

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

Lassen Sie es weg, um -deletezu zeigen, was gelöscht werden würde. Wenn Sie dies überprüft haben, führen Sie den vollständigen Befehl aus.

Das würde nur für Dateien laufen, nicht für Verzeichnisse. Verwenden Sie -type dfür die Umkehrung nur Verzeichnisse, die Ihren Argumenten entsprechen.


Zusatzoptionen

Vielleicht möchten Sie lesen man find, da Sie in Zukunft weitere Optionen benötigen könnten. Beispielsweise könnten -maxdepthSie die gefundenen Elemente nur auf eine bestimmte Tiefe beschränken, z. B. -maxdepth 0nicht in Unterverzeichnisse zurückkehren.

Einige Bemerkungen

  • Ich frage mich, wie der Befehl einen Ordner entfernt hätte, da Sie einen Ordner nicht rmnur mit entfernen können . Sie würden dafür brauchen rm -r.

  • Auch /path/to/files*ist verwirrend. Meinten Sie /path/to/files/oder erwarten Sie, dass der Platzhalter auf mehrere Datei- und Ordnernamen erweitert wird?

  • Setzen Sie das {}in einfache Anführungszeichen, um '{}'zu vermeiden, dass der ersetzte Datei- / Verzeichnisname von der Shell interpretiert wird, genau wie wir das Semikolon mit einem Backslash schützen.

slhck
quelle
Nun, es gibt eine Menge von Ordnern in / path / to / files /. Eigentlich möchte ich die mtime +10 -exec rm für jeden dieser Ordner ausführen, aber die Ordner selbst behalten. Grundsätzlich möchte ich erreichen, dass alle gelöscht werden Dateien älter als 10 Tage und behalten alle Ordner. Es tut mir leid, dass Neuling :)
JoyIan Yee-Hernandez
Na los gehts :) Mach einfach eine find /path/to/files* -type f -mtime +10und schau, was es ausgeben würde.
Slhck
Ja, wenn Sie Zweifel haben, tun Sie das nicht, sondern -execsehen Sie, was es zuerst findet.
Rob
2
@ JoyIanYee-Hernandez Du kannst auch das -deleteArgument to verwenden find, das alle Dateien und Ordner löscht, letzteres nur, wenn leer. Es impliziert -depth, dh Tiefensuche.
Daniel Beck
1
@Kreker Dann müssen Sie hinzufügen -mindepth 1, um das übergeordnete Verzeichnis auszuschließen.
Slhck
5

Wie in den vorherigen Antworten (+1 für beide) besteht der Trick darin, ein -type fPrädikat zu verwenden .

Beachten Sie, dass Sie anstelle von -exec rm '{}'auch -deletePrädikat verwenden können. Aber mach das nicht. Mit -exec rm '{}'können (und sollten) Sie zunächst -exec echo rm '{}'überprüfen, ob dies wirklich das ist, was Sie wollen. Führen Sie danach den Befehl ohne das Symbol erneut aus echo.

Die Verwendung -deleteist schneller (keine zusätzlichen fork()und execve()für jede Datei), dies ist jedoch riskant, da dies -deleteauch als Bedingung gilt.

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

aber wenn Sie nur die Argumente tauschen:

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

Wenn Sie jemals tonnenweise Dateien benötigen findund rmschneller arbeiten möchten, lesen Sie die find ... | xargs ... rmUNIX-IDiom.

Michał Šrajer
quelle
4
Ich denke, deine letzten beiden Beispiele sind genau die gleichen, vielleicht solltest du das korrigieren!
Slhck
1

Sie können dies einfach mit dem Befehl find tun

$ find -type f

Dadurch werden die Ergebnisse auf die Typdatei beschränkt

Bernhard
quelle
1

Ich hatte Mühe, dies mithilfe der oben bereitgestellten Skripte und einiger anderer Skripte zu korrigieren, insbesondere, wenn die Namen von Dateien und Ordnern Zeilenumbrüche oder Leerzeichen enthielten.

Endlich bin ich auf tmpreaper gestoßen und es hat bisher ziemlich gut für uns funktioniert.

tmpreaper -t 5d ~/Downloads


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

Original Quelle Link

Verfügt über Funktionen wie test, mit denen die Verzeichnisse rekursiv überprüft und aufgelistet werden. Möglichkeit zum Löschen von Symlinks, Dateien oder Verzeichnissen sowie des Schutzmodus für ein bestimmtes Muster beim Löschen

user52573
quelle
0

Um den Befehl zu beschleunigen, verwenden Sie '+'anstelle von\;

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

Dies wird rmnur einmal am Ende ausgeführt, anstatt jedes Mal, wenn eine Datei gefunden wird.
( rmKann aufgrund der Begrenzung der Befehlszeilenlänge mehrere Male ausgeführt werden, wenn Sie wirklich Unmengen von Dateien haben. Dies ist jedoch immer noch fast so schnell wie die Verwendung von. -delete)

olibre
quelle
0

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 `vor dem Finden und am Ende nach 5.

Nikhil Shinde
quelle