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.
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.
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.
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.
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
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)
find /path/to/files* -type f -mtime +10
und schau, was es ausgeben würde.-exec
sehen Sie, was es zuerst findet.-delete
Argument to verwendenfind
, das alle Dateien und Ordner löscht, letzteres nur, wenn leer. Es impliziert-depth
, dh Tiefensuche.-mindepth 1
, um das übergeordnete Verzeichnis auszuschließen.Wie in den vorherigen Antworten (+1 für beide) besteht der Trick darin, ein
-type f
Prädikat zu verwenden .Beachten Sie, dass Sie anstelle von
-exec rm '{}'
auch-delete
Prä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 ausecho
.Die Verwendung
-delete
ist schneller (keine zusätzlichenfork()
undexecve()
für jede Datei), dies ist jedoch riskant, da dies-delete
auch als Bedingung gilt.aber wenn Sie nur die Argumente tauschen:
Wenn Sie jemals tonnenweise Dateien benötigen
find
undrm
schneller arbeiten möchten, lesen Sie diefind ... | xargs ... rm
UNIX-IDiom.quelle
Sie können dies einfach mit dem Befehl find tun
Dadurch werden die Ergebnisse auf die Typdatei beschränkt
quelle
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.
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
quelle
Um den Befehl zu beschleunigen, verwenden Sie
'+'
anstelle von\;
Dies wird
rm
nur einmal am Ende ausgeführt, anstatt jedes Mal, wenn eine Datei gefunden wird.(
rm
Kann 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
)quelle
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.
quelle