Das regelmäßige manuelle Reinigen des Dateisystems ist nicht gut. Automatisieren Sie sie!
Das manuelle Löschen von Dateien und Ordnern ist keine spannende Aufgabe, wie man meinen könnte. Es ist sinnvoll, sie zu automatisieren.
Hier kommt Python, um unser Leben einfacher zu machen. Python ist eine hervorragende Programmiersprache für Skripte. Wir werden Python nutzen, um unsere Aufgabe ohne Hindernisse zu beenden. Zunächst sollten Sie wissen, warum Python eine gute Wahl ist.
- Python ist eine allzeit beliebte Sprache für die Automatisierung von Aufgaben
- Weniger Code im Vergleich zu anderen Programmiersprachen
- Python ist mit allen Betriebssystemen kompatibel. Sie können denselben Code unter Windows, Linux und Mac ausführen.
- Python hat ein Modul namens os, das uns hilft, mit dem Betriebssystem zu interagieren. Wir werden dieses Modul verwenden, um unsere Automatisierung des Löschens der Dateien abzuschließen.
Wir können alle lästigen oder sich wiederholenden Systemaufgaben mit Python ersetzen. Das Schreiben von Skripten zum Ausführen einer bestimmten Systemaufgabe ist ein Kinderspiel, wenn Sie Python kennen. Sehen wir uns den folgenden Anwendungsfall an.
Hinweis: Folgendes wurde auf Python 3.6+ getestet
Inhaltsverzeichnis
Entfernen von Dateien/Ordnern, die älter als X Tage sind
Oft benötigen Sie keine alten Protokolle und müssen diese regelmäßig bereinigen, um Speicherplatz verfügbar zu machen. Es könnte alles sein und nicht nur Protokolle.
Wir haben eine Methode namens stat im os-Modul, die Details zur Zeit des letzten Zugriffs (st_atime), der Änderung (st_mtime) und der Änderung der Metadaten (st_ctime) liefert. Alle Methoden geben die Zeit in Sekunden seit der Epoche zurück. Weitere Details zur Epoche finden Sie hier.
Wir verwenden eine Methode namens os.walk(path) zum Durchlaufen der Unterordner eines Ordners.
Führen Sie die folgenden Schritte aus, um Code für die Löschdateien/-ordner basierend auf der Anzahl der Tage zu schreiben.
- Importieren Sie die Module time, os, shutdown
- Legen Sie den Pfad und die Tage für die Variablen fest
- Konvertieren Sie die Anzahl der Tage mit der Methode time.time() in Sekunden
- Überprüfen Sie, ob der Pfad existiert oder nicht, indem Sie das Modul os.path.exists(path) verwenden
- Wenn der Pfad vorhanden ist, erhalten Sie die Liste der Dateien und Ordner, die im Pfad vorhanden sind, einschließlich Unterordnern. Verwenden Sie die Methode os.walk(path), und sie gibt einen Generator zurück, der Ordner, Dateien und Unterordner enthält
- Rufen Sie den Pfad der Datei oder des Ordners ab, indem Sie sowohl den aktuellen Pfad als auch den Datei-/Ordnernamen mit der Methode os.path.join() verknüpfen.
- Rufen Sie die ctime aus der Methode os.stat(path) mit dem Attribut st_ctime ab
- Vergleichen Sie die ctime mit der zuvor berechneten Zeit
- Wenn das Ergebnis größer ist als die gewünschten Tage des Benutzers, dann 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 verwenden Sie die Methode shutdown.rmtree()
- Wenn der Pfad nicht existiert, drucke die Nachricht nicht gefunden
Sehen wir uns den Code im Detail an.
# importing the required modules import os import shutil import time # main function def main(): # initializing the count deleted_folders_count = 0 deleted_files_count = 0 # specify the path path = "/PATH_TO_DELETE" # specify the days days = 30 # converting days to seconds # time.time() returns current time in seconds seconds = time.time() - (days * 24 * 60 * 60) # checking whether the file is present in path or not if os.path.exists(path): # iterating over each and every folder and file in the path for root_folder, folders, files in os.walk(path): # comparing the days if seconds >= get_file_or_folder_age(root_folder): # removing the folder remove_folder(root_folder) deleted_folders_count += 1 # incrementing count # breaking after removing the root_folder break else: # checking folder from the root_folder for folder in folders: # folder path folder_path = os.path.join(root_folder, folder) # comparing with the days if seconds >= get_file_or_folder_age(folder_path): # invoking the remove_folder function remove_folder(folder_path) deleted_folders_count += 1 # incrementing count # checking the current directory files for file in files: # file path file_path = os.path.join(root_folder, file) # comparing the days if seconds >= get_file_or_folder_age(file_path): # invoking the remove_file function remove_file(file_path) deleted_files_count += 1 # incrementing count else: # if the path is not a directory # comparing with the days if seconds >= get_file_or_folder_age(path): # invoking the file remove_file(path) deleted_files_count += 1 # incrementing count else: # file/folder is not found print(f'"{path}" is not found') deleted_files_count += 1 # incrementing count print(f"Total folders deleted: {deleted_folders_count}") print(f"Total files deleted: {deleted_files_count}") def remove_folder(path): # removing the folder if not shutil.rmtree(path): # success message print(f"{path} is removed successfully") else: # failure message print(f"Unable to delete the {path}") def remove_file(path): # removing the file if not os.remove(path): # success message print(f"{path} is removed successfully") else: # failure message print(f"Unable to delete the {path}") def get_file_or_folder_age(path): # getting ctime of the file/folder # time will be in seconds ctime = os.stat(path).st_ctime # returning the time return ctime if __name__ == '__main__': main()
Sie müssen die folgenden zwei Variablen im obigen Code basierend auf der Anforderung anpassen.
days = 30 path = "/PATH_TO_DELETE"
Entfernen von Dateien, die größer als X GB sind
Lassen Sie uns nach den Dateien suchen, die größer als eine bestimmte Größe sind, und sie löschen. Es ähnelt dem obigen Skript. Im vorherigen Skript haben wir das Alter als Parameter genommen, und jetzt nehmen wir die Größe als Parameter für die Löschung.
# importing the os module import os # function that returns size of a file def get_file_size(path): # getting file size in bytes size = os.path.getsize(path) # returning the size of the file return size # function to delete a file def remove_file(path): # deleting the file if not os.remove(path): # success print(f"{path} is deleted successfully") else: # error print(f"Unable to delete the {path}") def main(): # specify the path path = "ENTER_PATH_HERE" # put max size of file in MBs size = 500 # checking whether the path exists or not if os.path.exists(path): # converting size to bytes size = size * 1024 * 1024 # traversing through the subfolders for root_folder, folders, files in os.walk(path): # iterating over the files list for file in files: # getting file path file_path = os.path.join(root_folder, file) # checking the file size if get_file_size(file_path) >= size: # invoking the remove_file function remove_file(file_path) else: # checking only if the path is file if os.path.isfile(path): # path is not a dir # checking the file directly if get_file_size(path) >= size: # invoking the remove_file function remove_file(path) else: # path doesn't exist print(f"{path} doesn't exist") if __name__ == '__main__': main()
Passen Sie die folgenden beiden Variablen an.
path = "ENTER_PATH_HERE" size = 500
Entfernen von Dateien mit einer bestimmten Erweiterung
Es kann ein Szenario geben, in dem Sie Dateien nach ihren Erweiterungstypen löschen möchten. Sagen wir .log-Datei. Wir können die Erweiterung einer Datei mit der Methode os.path.splitext(path) finden. Es gibt ein Tupel zurück, das den Pfad und die Erweiterung der Datei enthält.
# importing os module import os # main function def main(): # specify the path path = "PATH_TO_LOOK_FOR" # specify the extension extension = ".log" # checking whether the path exist or not if os.path.exists(path): # check whether the path is directory or not if os.path.isdir(path): # iterating through the subfolders for root_folder, folders, files in os.walk(path): # checking of the files for file in files: # file path file_path = os.path.join(root_folder, file) # extracting the extension from the filename file_extension = os.path.splitext(file_path)[1] # checking the file_extension if extension == file_extension: # deleting the file if not os.remove(file_path): # success message print(f"{file_path} deleted successfully") else: # failure message print(f"Unable to delete the {file_path}") else: # path is not a directory print(f"{path} is not a directory") else: # path doen't exist print(f"{path} doesn't exist") if __name__ == '__main__': # invoking main function main()
Vergessen Sie nicht, den Pfad und die Erweiterungsvariable im obigen Code zu aktualisieren, um Ihre Anforderungen zu erfüllen.
Ich würde vorschlagen, die Skripte in der NICHT-PRODUKTIONS-Umgebung zu testen. Sobald Sie mit den Ergebnissen zufrieden sind, können Sie über cron (bei Verwendung von Linux) eine regelmäßige Ausführung für Wartungsarbeiten planen. Python ist großartig, um diese Dinge zu erreichen, und wenn Sie daran interessiert sind, mehr zu lernen, dann schauen Sie sich das an Udemy-Kurs.
Haben Sie den Artikel gerne gelesen? Wie wäre es mit dem Teilen mit der Welt?