Nettoyer régulièrement le système de fichiers manuellement n’est pas bon. Automatisez-les !
La suppression manuelle de fichiers et de dossiers n’est pas une tâche passionnante, comme on peut le penser. Il est logique de les automatiser.
Voici Python pour nous faciliter la vie. Python est un excellent langage de programmation pour les scripts. Nous allons profiter de Python pour terminer notre tâche sans aucun obstacle. Tout d’abord, vous devez savoir pourquoi Python est un bon choix.
- Python est un langage préféré de tous les temps pour automatiser les tâches
- Moins de code par rapport aux autres langages de programmation
- Python est compatible avec tous les systèmes d’exploitation. Vous pouvez exécuter le même code sous Windows, Linux et Mac.
- Python a un module appelé os qui nous aide à interagir avec le système d’exploitation. Nous allons utiliser ce module pour compléter notre automatisation de la suppression des fichiers.
Nous pouvons remplacer toutes les tâches système ennuyeuses ou répétitives en utilisant Python. Écrire des scripts pour effectuer une tâche système spécifique est un petit gâteau si vous connaissez Python. Regardons le cas d’utilisation suivant.
Remarque : les éléments suivants sont testés sur Python 3.6+
Table des matières
Suppression de fichiers/dossiers de plus de X jours
Souvent, vous n’avez pas besoin de vieilles bûches et vous devez régulièrement les nettoyer pour libérer de l’espace de stockage. Il peut s’agir de n’importe quoi et pas seulement de journaux.
Nous avons une méthode appelée stat dans le module os qui donne des détails sur l’heure du dernier accès (st_atime), de la modification (st_mtime) et de la modification des métadonnées (st_ctime). Toutes les méthodes renvoient le temps en secondes depuis l’époque. Vous pouvez trouver plus de détails sur l’époque ici.
Nous utiliserons une méthode appelée os.walk(path) pour parcourir les sous-dossiers d’un dossier.
Suivez les étapes ci-dessous pour écrire du code pour les fichiers/dossiers de suppression en fonction du nombre de jours.
- Importer les modules time, os, shutdown
- Définissez le chemin et les jours des variables
- Convertir le nombre de jours en secondes en utilisant la méthode time.time()
- Vérifiez si le chemin existe ou non en utilisant le module os.path.exists(path)
- Si le chemin existe, obtenez la liste des fichiers et dossiers présents dans le chemin, y compris les sous-dossiers. Utilisez la méthode os.walk(path) et elle renverra un générateur contenant des dossiers, des fichiers et des sous-dossiers
- Obtenez le chemin du fichier ou du dossier en joignant à la fois le chemin actuel et le nom du fichier/dossier à l’aide de la méthode os.path.join()
- Obtenez le ctime de la méthode os.stat(path) en utilisant l’attribut st_ctime
- Comparez le ctime avec le temps que nous avons calculé précédemment
- Si le résultat est supérieur aux jours souhaités de l’utilisateur, vérifiez s’il s’agit d’un fichier ou d’un dossier. S’il s’agit d’un fichier, utilisez os.remove(path) sinon utilisez la méthode shutdown.rmtree()
- Si le chemin n’existe pas, affiche le message introuvable
Voyons le code en détail.
# 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()
Vous devez ajuster les deux variables suivantes dans le code ci-dessus en fonction de l’exigence.
days = 30 path = "/PATH_TO_DELETE"
Suppression de fichiers supérieurs à X Go
Recherchons les fichiers dont la taille dépasse une certaine taille et supprimons-les. Il est similaire au script ci-dessus. Dans le script précédent, nous avons pris l’âge comme paramètre, et maintenant nous prendrons la taille comme paramètre pour la suppression.
# 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()
Ajustez les deux variables suivantes.
path = "ENTER_PATH_HERE" size = 500
Suppression de fichiers avec une extension spécifique
Il peut y avoir un scénario où vous souhaitez supprimer des fichiers par leurs types d’extension. Disons un fichier .log. Nous pouvons trouver l’extension d’un fichier en utilisant la méthode os.path.splitext(path). Il renvoie un tuple contenant le chemin et l’extension du fichier.
# 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()
N’oubliez pas de mettre à jour le chemin et la variable d’extension dans le code ci-dessus pour répondre à vos besoins.
Je suggérerais de tester les scripts dans l’environnement NON PRODUCTION. Une fois que vous êtes satisfait des résultats, vous pouvez programmer via cron (si vous utilisez Linux) pour l’exécuter périodiquement pour les travaux de maintenance. Python est idéal pour réaliser ce genre de choses et si vous êtes intéressé à apprendre à en faire plus, consultez ceci Cours Udemy.
Vous avez apprécié la lecture de l’article ? Que diriez-vous de partager avec le monde ?