Die regelmäßige, händische Bereinigung des Dateisystems ist wenig effizient. Es ist ratsamer, diesen Prozess zu automatisieren!
Das manuelle Entfernen von Dateien und Verzeichnissen ist keine besonders ansprechende Aufgabe. Daher ist es sinnvoll, diesen Vorgang zu automatisieren.
Hier kommt Python ins Spiel, um unsere Arbeit zu erleichtern. Python ist eine ausgezeichnete Programmiersprache für die Skripterstellung. Wir werden Python nutzen, um diese Aufgabe reibungslos zu erledigen. Zunächst sollten wir uns ansehen, warum Python eine gute Wahl ist.
- Python ist eine beliebte Sprache für die Automatisierung von Aufgaben
- Es erfordert weniger Code im Vergleich zu anderen Programmiersprachen.
- Python ist mit allen gängigen Betriebssystemen kompatibel. Sie können denselben Code unter Windows, Linux und macOS ausführen.
- Python verfügt über ein Modul namens „os“, das uns bei der Interaktion mit dem Betriebssystem unterstützt. Dieses Modul werden wir für unsere Automatisierung der Dateilöschung verwenden.
Wir können mit Python alle umständlichen oder sich wiederholenden Systemaufgaben ersetzen. Das Schreiben von Skripten zur Ausführung einer bestimmten Systemaufgabe ist sehr einfach, wenn man Python beherrscht. Betrachten wir den folgenden Anwendungsfall.
Hinweis: Die folgenden Beispiele wurden mit Python 3.6+ getestet.
Entfernen von Dateien/Verzeichnissen, die älter als X Tage sind
Oftmals sind ältere Protokolldateien nicht mehr erforderlich und müssen regelmäßig entfernt werden, um Speicherplatz freizugeben. Dies kann sich auf jegliche Art von Dateien beziehen, nicht nur Protokolle.
Das „os“-Modul bietet eine Methode namens „stat“, die Details zum Zeitpunkt des letzten Zugriffs (st_atime), der Änderung (st_mtime) und der Metadatenänderung (st_ctime) liefert. Diese Methoden geben den Zeitpunkt in Sekunden seit der Epoche zurück. Weitere Informationen zur Epoche finden Sie hier.
Wir verwenden die Methode „os.walk(path)“, um die Unterverzeichnisse eines Ordners zu durchlaufen.
Führen Sie die folgenden Schritte aus, um einen Code zum Löschen von Dateien/Verzeichnissen basierend auf der Anzahl der Tage zu schreiben:
- Importieren Sie die Module „time“, „os“ und „shutil“.
- Definieren Sie Variablen für den Pfad und die Anzahl der Tage.
- Wandeln Sie die Anzahl der Tage mit der Methode „time.time()“ in Sekunden um.
- Überprüfen Sie mit dem Modul „os.path.exists(path)“, ob der Pfad existiert.
- Falls der Pfad existiert, erhalten Sie die Liste der Dateien und Ordner, die sich im Pfad befinden, einschließlich der Unterordner. Verwenden Sie die Methode „os.walk(path)“, die einen Generator zurückgibt, der Ordner, Dateien und Unterordner enthält.
- Ermitteln Sie den Pfad der Datei oder des Ordners, indem Sie den aktuellen Pfad und den Datei-/Ordnernamen mit der Methode „os.path.join()“ kombinieren.
- Rufen Sie die ctime mit dem Attribut „st_ctime“ der Methode „os.stat(path)“ ab.
- Vergleichen Sie die ctime mit der zuvor berechneten Zeit.
- Wenn das Ergebnis größer ist als die gewünschte Anzahl von Tagen, prüfen Sie, ob es sich um eine Datei oder einen Ordner handelt. Wenn es sich um eine Datei handelt, verwenden Sie „os.remove(path)“, andernfalls die Methode „shutil.rmtree()“.
- Wenn der Pfad nicht existiert, geben Sie eine entsprechende Meldung aus.
Betrachten wir den Code im Detail:
# Importiere die erforderlichen Module
import os
import shutil
import time
# Hauptfunktion
def main():
# Initialisiere die Zähler
deleted_folders_count = 0
deleted_files_count = 0
# Definiere den Pfad
path = "/PFAD_ZUM_LÖSCHEN"
# Definiere die Anzahl der Tage
days = 30
# Wandle die Tage in Sekunden um
# time.time() gibt die aktuelle Zeit in Sekunden zurück
seconds = time.time() - (days * 24 * 60 * 60)
# Überprüfe, ob der Pfad existiert
if os.path.exists(path):
# Iteriere über alle Ordner und Dateien im Pfad
for root_folder, folders, files in os.walk(path):
# Vergleiche das Alter
if seconds >= get_file_or_folder_age(root_folder):
# Entferne den Ordner
remove_folder(root_folder)
deleted_folders_count += 1 # Erhöhe den Zähler
# Beende die Iteration nach dem Entfernen des Root-Ordners
break
else:
# Überprüfe die Ordner im Root-Ordner
for folder in folders:
# Ordnerpfad
folder_path = os.path.join(root_folder, folder)
# Vergleiche mit der Anzahl der Tage
if seconds >= get_file_or_folder_age(folder_path):
# Rufe die Funktion zum Entfernen des Ordners auf
remove_folder(folder_path)
deleted_folders_count += 1 # Erhöhe den Zähler
# Überprüfe die Dateien im aktuellen Verzeichnis
for file in files:
# Dateipfad
file_path = os.path.join(root_folder, file)
# Vergleiche mit der Anzahl der Tage
if seconds >= get_file_or_folder_age(file_path):
# Rufe die Funktion zum Entfernen der Datei auf
remove_file(file_path)
deleted_files_count += 1 # Erhöhe den Zähler
else:
# Wenn der Pfad keine Verzeichnis ist
# Vergleiche mit der Anzahl der Tage
if seconds >= get_file_or_folder_age(path):
# Rufe die Funktion zum Entfernen der Datei auf
remove_file(path)
deleted_files_count += 1 # Erhöhe den Zähler
else:
# Datei/Ordner nicht gefunden
print(f'"{path}" wurde nicht gefunden')
deleted_files_count += 1 # Erhöhe den Zähler
print(f"Anzahl der gelöschten Ordner: {deleted_folders_count}")
print(f"Anzahl der gelöschten Dateien: {deleted_files_count}")
def remove_folder(path):
# Entferne den Ordner
if not shutil.rmtree(path):
# Erfolgsmeldung
print(f"{path} wurde erfolgreich entfernt")
else:
# Fehlermeldung
print(f"Kann {path} nicht löschen")
def remove_file(path):
# Entferne die Datei
if not os.remove(path):
# Erfolgsmeldung
print(f"{path} wurde erfolgreich entfernt")
else:
# Fehlermeldung
print(f"Kann {path} nicht löschen")
def get_file_or_folder_age(path):
# Ermittle die ctime der Datei/des Ordners
# Die Zeit wird in Sekunden angegeben
ctime = os.stat(path).st_ctime
# Gib die Zeit zurück
return ctime
if __name__ == '__main__':
main()
Passen Sie die folgenden zwei Variablen im obigen Code gemäß Ihren Anforderungen an:
days = 30
path = "/PFAD_ZUM_LÖSCHEN"
Entfernen von Dateien, die größer als X GB sind
Suchen und löschen wir Dateien, die eine bestimmte Größe überschreiten. Dies ähnelt dem vorherigen Skript. Während wir dort das Alter als Parameter verwendet haben, wird nun die Dateigröße für die Löschung verwendet.
# Importiere das os-Modul
import os
# Funktion zur Ermittlung der Dateigröße
def get_file_size(path):
# Ermittle die Dateigröße in Bytes
size = os.path.getsize(path)
# Gib die Dateigröße zurück
return size
# Funktion zum Entfernen einer Datei
def remove_file(path):
# Entferne die Datei
if not os.remove(path):
# Erfolgsmeldung
print(f"{path} wurde erfolgreich gelöscht")
else:
# Fehlermeldung
print(f"Kann {path} nicht löschen")
def main():
# Definiere den Pfad
path = "PFAD_HIER_EINFÜGEN"
# Definiere die maximale Dateigröße in MB
size = 500
# Überprüfe, ob der Pfad existiert
if os.path.exists(path):
# Wandle die Größe in Bytes um
size = size * 1024 * 1024
# Iteriere durch die Unterordner
for root_folder, folders, files in os.walk(path):
# Iteriere über die Dateiliste
for file in files:
# Ermittle den Dateipfad
file_path = os.path.join(root_folder, file)
# Überprüfe die Dateigröße
if get_file_size(file_path) >= size:
# Rufe die Funktion zum Entfernen der Datei auf
remove_file(file_path)
else:
# Überprüfe nur, ob der Pfad eine Datei ist
if os.path.isfile(path):
# Der Pfad ist kein Verzeichnis
# Überprüfe die Datei direkt
if get_file_size(path) >= size:
# Rufe die Funktion zum Entfernen der Datei auf
remove_file(path)
else:
# Der Pfad existiert nicht
print(f"{path} existiert nicht")
if __name__ == '__main__':
main()
Passen Sie die folgenden beiden Variablen an:
path = "PFAD_HIER_EINFÜGEN"
size = 500
Entfernen von Dateien mit einer bestimmten Erweiterung
In manchen Fällen kann es erforderlich sein, Dateien anhand ihrer Dateierweiterung zu löschen, z.B. .log-Dateien. Die Erweiterung einer Datei kann mit der Methode „os.path.splitext(path)“ ermittelt werden, welche ein Tupel mit dem Pfad und der Erweiterung der Datei zurückgibt.
# Importiere das os-Modul
import os
# Hauptfunktion
def main():
# Definiere den Pfad
path = "PFAD_ZUM_SUCHEN"
# Definiere die Erweiterung
extension = ".log"
# Überprüfe, ob der Pfad existiert
if os.path.exists(path):
# Überprüfe, ob der Pfad ein Verzeichnis ist
if os.path.isdir(path):
# Iteriere durch die Unterordner
for root_folder, folders, files in os.walk(path):
# Überprüfe die Dateien
for file in files:
# Dateipfad
file_path = os.path.join(root_folder, file)
# Extrahiere die Erweiterung aus dem Dateinamen
file_extension = os.path.splitext(file_path)[1]
# Überprüfe die Dateierweiterung
if extension == file_extension:
# Lösche die Datei
if not os.remove(file_path):
# Erfolgsmeldung
print(f"{file_path} wurde erfolgreich gelöscht")
else:
# Fehlermeldung
print(f"Kann {file_path} nicht löschen")
else:
# Der Pfad ist kein Verzeichnis
print(f"{path} ist kein Verzeichnis")
else:
# Der Pfad existiert nicht
print(f"{path} existiert nicht")
if __name__ == '__main__':
# Rufe die Hauptfunktion auf
main()
Denken Sie daran, die Pfad- und Erweiterungsvariablen im obigen Code zu aktualisieren, um Ihre Anforderungen zu erfüllen.
Es wird empfohlen, die Skripte in einer Nicht-Produktionsumgebung zu testen. Wenn Sie mit den Ergebnissen zufrieden sind, können Sie eine regelmäßige Ausführung für Wartungsarbeiten über cron (bei Verwendung von Linux) planen. Python ist ideal für diese Art von Aufgaben, und falls Sie Interesse haben mehr zu lernen, schauen Sie sich diesen Udemy-Kurs an.
Hat Ihnen der Artikel gefallen? Dann teilen Sie ihn doch mit anderen!