Python-Skripte zum regelmäßigen Löschen der Dateien

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!