
Montag, 7. Januar 2019
Linux: Dateien und Verzeichnisse finden und löschen mit 'find'

Im Gegensatz zur, häufig mit find genutzten, Option -delete verwende ich hier -exec rm, da mittels rm auch Verzeichnisse gelöscht werden können, die nicht leer sind. Das Löschen erfolgt ohne Rückfrage und rekursiv, umfasst also sämtliche Unterverzeichnisse inklusive deren Inhalt. Das Startverzeichnis definiert jene Stelle, ab der gesucht werden soll.
Suchen und löschen von Verzeichnissen
Löscht alle Verzeichnisse unterhalb des Startpunktes, die mit "a" beginnen. Die Option -type d (directory) begrenzt die Suche auf Verzeichnisse, Dateien mit selbem Namen werden bei der Suche ignoriert.
Suchen und löschen von Dateien
Löscht alle Dateien unterhalb des Startpunktes, die mit "a" beginnen. Dafür sorgt die Option -type f (file).
Löschen von Dateien und Verzeichnissen
Durch den Verzicht auf die Option -type werden Verzeichnisse und Dateien berücksichtigt. Gelöscht werden sowohl Verzeichnisse als auch einzelne Dateien unterhalb des Startpunktes, deren Namen mit "a" beginnen.
Optional: Suchtiefe begrenzen
Begrenzt die Suchtiefe auf die erste Ebene (das Startverzeichnis), siehe -maxdepth 1. Löscht alle Dateien im Startverzeichnis, die mit "a" beginnen.
Löschen von Dateien oder Verzeichnissen nach Alter
Diese Variante löscht Verzeichnisse (oder auf Wunsch einzelne Dateien) unterhalb des Startpunktes, deren Änderungsdatum länger als 5 Tage zurückliegt. Dafür sorgt -mtime +5.
Automatische Ausführung per Cronjob
Natürlich können die genannten Beispiele auch automatisch und zeitgesteuert ausgeführt werden. Dazu den jeweiligen Befehl in ein Shellscript mit der Dateiendung .sh packen und mittels Cronjob anstoßen:
WICHTIG: VORHER TESTEN!
Wie bei allen Linux-Befehlen mit Löschfunktion empfehle ich dringend, die Befehle vor dem Live-Einsatz ohne rm zu testen. Dazu einfach die Direktive -exec rm -rf {} + entfernen, es wird dann nichts gelöscht. Die gefundenen Dateien und Verzeichnisse werden in der Konsole angezeigt und können überprüft werden. Ein Beispiel: Bei der Ausführung von find und rm ohne Suchparameter wird etwa das gesamte Startverzeichnis gelöscht! Auch ist darauf zu achten, dass die Lösch-Direktive zwingend am Ende des Codes stehen muss. Beides gilt aber auch für die Standard-Löschoption -delete.
ABSOLUTE No-Go's sind daher:
Bei diesen Negativ-Beispielen würde nicht nur das komplette Startverzeichnis inklusive aller Unterverzeichnisse, sondern auch das Startverzeichnis selbst gelöscht werden. Was das bedeutet, falls der Document Root als Startpunkt gesetzt wurde, kann man sich (schaudernd) vorstellen. Man sieht: Der find-Befehl ist ein mächtiges Werkzeug, hat aber auch seine Tücken.
Und weil's so wichtig ist: Hier nochmals alle Sicherheitstipps für find in Verbindung mit den Löschfunktionen rm und -delete
Beim Ausführen von UNIX-Befehlen direkt am Server ist, besonders bei Nichtkenntnis der Unix-Befehlsstruktur, Vorsicht geboten. Vor allem die Pfade müssen korrekt angegeben und die Syntax eingehalten werden, um ein ungewolltes Löschen zu vermeiden. Ich kann keine Verantwortung für etwaigen Datenverlust übernehmen!
Suchen und löschen von Verzeichnissen
# Suchen und löschen von Verzeichnissen
find /pfad/zum/startverzeichnis/ -name "a*" -type d -exec rm -rf {} +
find /pfad/zum/startverzeichnis/ -name "a*" -type d -exec rm -rf {} +
Löscht alle Verzeichnisse unterhalb des Startpunktes, die mit "a" beginnen. Die Option -type d (directory) begrenzt die Suche auf Verzeichnisse, Dateien mit selbem Namen werden bei der Suche ignoriert.
Suchen und löschen von Dateien
# Suchen und löschen von Dateien
find /pfad/zum/startverzeichnis/ -name "a*" -type f -exec rm -rf {} +
find /pfad/zum/startverzeichnis/ -name "a*" -type f -exec rm -rf {} +
Löscht alle Dateien unterhalb des Startpunktes, die mit "a" beginnen. Dafür sorgt die Option -type f (file).
Löschen von Dateien und Verzeichnissen
# Löschen von Dateien und Verzeichnissen
find /pfad/zum/startverzeichnis/ -name "a*" -exec rm -rf {} +
find /pfad/zum/startverzeichnis/ -name "a*" -exec rm -rf {} +
Durch den Verzicht auf die Option -type werden Verzeichnisse und Dateien berücksichtigt. Gelöscht werden sowohl Verzeichnisse als auch einzelne Dateien unterhalb des Startpunktes, deren Namen mit "a" beginnen.
Optional: Suchtiefe begrenzen
# Suchtiefe begrenzen
find /pfad/zum/startverzeichnis/ -name "a*" -type f -maxdepth 1 -exec rm -rf {} +
find /pfad/zum/startverzeichnis/ -name "a*" -type f -maxdepth 1 -exec rm -rf {} +
Begrenzt die Suchtiefe auf die erste Ebene (das Startverzeichnis), siehe -maxdepth 1. Löscht alle Dateien im Startverzeichnis, die mit "a" beginnen.
Löschen von Dateien oder Verzeichnissen nach Alter
# Löschen von Dateien oder Verzeichnissen nach Alter
find /pfad/zum/startverzeichnis/ -name "a*" -type d -mtime +5 -exec rm -rf {} +
find /pfad/zum/startverzeichnis/ -name "a*" -type d -mtime +5 -exec rm -rf {} +
Diese Variante löscht Verzeichnisse (oder auf Wunsch einzelne Dateien) unterhalb des Startpunktes, deren Änderungsdatum länger als 5 Tage zurückliegt. Dafür sorgt -mtime +5.
Automatische Ausführung per Cronjob
Natürlich können die genannten Beispiele auch automatisch und zeitgesteuert ausgeführt werden. Dazu den jeweiligen Befehl in ein Shellscript mit der Dateiendung .sh packen und mittels Cronjob anstoßen:
#!/bin/bash
find /pfad/zum/startverzeichnis/ -name "a*" -type d -exec rm -rf {} +
find /pfad/zum/startverzeichnis/ -name "a*" -type d -exec rm -rf {} +
WICHTIG: VORHER TESTEN!
Wie bei allen Linux-Befehlen mit Löschfunktion empfehle ich dringend, die Befehle vor dem Live-Einsatz ohne rm zu testen. Dazu einfach die Direktive -exec rm -rf {} + entfernen, es wird dann nichts gelöscht. Die gefundenen Dateien und Verzeichnisse werden in der Konsole angezeigt und können überprüft werden. Ein Beispiel: Bei der Ausführung von find und rm ohne Suchparameter wird etwa das gesamte Startverzeichnis gelöscht! Auch ist darauf zu achten, dass die Lösch-Direktive zwingend am Ende des Codes stehen muss. Beides gilt aber auch für die Standard-Löschoption -delete.
ABSOLUTE No-Go's sind daher:
# NICHT verwenden!
find /../ -exec rm -rf {} + # FALSCH! Keine Suchparameter!
find /../ -delete # FALSCH! Keine Suchparameter!
find /../ -exec rm -rf {} + -name "a*" -type f # FALSCHE Reihenfolge!
find /../ -delete -name "a*" -type f # FALSCHE Reihenfolge!
find /../ -name "*" -exec rm -rf {} + # FALSCHER Suchparameter (*)!
find /../ -name "*" -type d -exec rm -rf {} + # FALSCHER Suchparameter (*)!
find /../ -name "*" -mtime -5 -exec rm -rf {} + # FALSCHER Suchparameter (*)!
find /../ -exec rm -rf {} + # FALSCH! Keine Suchparameter!
find /../ -delete # FALSCH! Keine Suchparameter!
find /../ -exec rm -rf {} + -name "a*" -type f # FALSCHE Reihenfolge!
find /../ -delete -name "a*" -type f # FALSCHE Reihenfolge!
find /../ -name "*" -exec rm -rf {} + # FALSCHER Suchparameter (*)!
find /../ -name "*" -type d -exec rm -rf {} + # FALSCHER Suchparameter (*)!
find /../ -name "*" -mtime -5 -exec rm -rf {} + # FALSCHER Suchparameter (*)!
Bei diesen Negativ-Beispielen würde nicht nur das komplette Startverzeichnis inklusive aller Unterverzeichnisse, sondern auch das Startverzeichnis selbst gelöscht werden. Was das bedeutet, falls der Document Root als Startpunkt gesetzt wurde, kann man sich (schaudernd) vorstellen. Man sieht: Der find-Befehl ist ein mächtiges Werkzeug, hat aber auch seine Tücken.
Und weil's so wichtig ist: Hier nochmals alle Sicherheitstipps für find in Verbindung mit den Löschfunktionen rm und -delete
• Nicht ohne korrekte Suchparameter verwenden
• Löschbefehl immer am Ende der Codezeile
• Vor dem ersten Live-Einsatz ohne rm / -delete testen
• Nach Möglichkeit nicht den Document Root (/) als Startpunkt definieren
• Löschbefehl immer am Ende der Codezeile
• Vor dem ersten Live-Einsatz ohne rm / -delete testen
• Nach Möglichkeit nicht den Document Root (/) als Startpunkt definieren

Trackbacks
Trackback-URL für diesen Eintrag
Keine Trackbacks
Kommentare
Ansicht der Kommentare:
(Linear | Verschachtelt)
Zu diesem Artikel können leider keine Kommentare gepostet werden.