Das regelmäßige manuelle Reinigen des Dateisystems ist nicht gut. Automatisieren Sie sie!
Das manuelle Löschen von Dateien und Ordnern ist keine aufregende Aufgabe, wie man vielleicht denkt. Es ist sinnvoll, sie zu automatisieren.
Hier kommt Python, um unser Leben leichter zu machen. Python ist eine ausgezeichnete Programmiersprache für Skripte. Wir werden Python nutzen, um unsere Aufgabe ohne Hindernisse zu erledigen. Zuerst sollten Sie wissen warum Python ist eine gute Wahl.
- Python ist eine 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 hilft uns, 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. Schauen wir uns den folgenden Anwendungsfall an.
Hinweis: Die folgenden Tests wurden unter Python 3.6+ getestet
Removing files/folders older than X days
Oft benötigen Sie keine alten Protokolle und müssen diese regelmäßig bereinigen, um Speicher verfügbar zu machen. Es könnte alles sein und nicht nur Protokolle.
Wir haben eine Methode namens stat
der os
Modul, das Details zum letzten Zugriff enthält (st_atime), Modifikation (st_mtime), und Metadatenänderung (st_ctime) Zeit. Alle Methoden geben die Zeit in Sekunden seit der Epoche zurück. Weitere Details zur Epoche finden Sie hier.
Wir werden eine Methode namens verwenden os.walk(path)
zum Durchsuchen 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 Zeit, os, Shutil
- Legen Sie den Pfad und die Tage für die Variablen fest
- Konvertieren Sie die Anzahl der Tage in Sekunden mit Zeit Zeit() Methode
- Überprüfen Sie, ob der Pfad vorhanden ist oder nicht os.path.exists (Pfad) Modul
- Wenn der Pfad vorhanden ist, rufen Sie die Liste der im Pfad vorhandenen Dateien und Ordner ab, einschließlich der Unterordner. Verwenden Sie die Methode os.walk (Pfad), und es wird ein Generator zurückgegeben, der Ordner, Dateien und Unterordner enthält
- Rufen Sie den Pfad der Datei oder des Ordners ab, indem Sie mit der Methode sowohl den aktuellen Pfad als auch den Datei- / Ordnernamen verbinden os.path.join ()
- Bekommen das ctime von dem os.stat (Pfad) Methode unter Verwendung des Attributs st_ctime
- Vergleich die ctime mit der Zeit, die wir zuvor berechnet haben
- Wenn das Ergebnis größer als die gewünschten Tage des Benutzers ist, prüfen Sie, ob es sich um eine Datei oder einen Ordner handelt. Wenn es sich um eine Datei handelt, verwenden Sie die os.remove (Pfad) sonst benutze die shutil.rmtree () Methode
- Wenn der Pfad nicht vorhanden ist, drucken Sie 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"
Removing files larger than X GB
Lassen Sie uns nach 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 genommen Alter als Parameter, und jetzt werden wir nehmen Größe als Parameter für das Löschen.
# 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 zwei Variablen an.
path = "ENTER_PATH_HERE"
size = 500
Removing files with a specific extension
Möglicherweise möchten Sie Dateien nach ihren Erweiterungstypen löschen. Sagen wir .log
Datei. Wir können die Erweiterung einer Datei mit dem finden os.path.splitext(path)
Methode. 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 Ihren Anforderungen zu entsprechen.
Ich würde vorschlagen, die Skripte in der NON PRODUCTION-Umgebung zu testen. Sobald Sie mit den Ergebnissen zufrieden sind, können Sie einen Zeitplan erstellen cron (wenn Sie Linux verwenden), um es regelmäßig für Wartungsarbeiten auszuführen. Python ist großartig, um dieses Ziel zu erreichen. Wenn Sie mehr lernen möchten, lesen Sie dies Udemy natürlich.