L’entretien manuel de votre système de fichiers n’est pas optimal. Il est préférable d’automatiser ces tâches!
La suppression manuelle de fichiers et de répertoires peut être perçue comme une corvée fastidieuse. L’automatisation de ce processus est une approche plus efficace.
Python est un allié précieux pour simplifier cette tâche. Ce langage de programmation est particulièrement bien adapté à la création de scripts. Nous allons exploiter les capacités de Python pour automatiser cette opération sans rencontrer d’obstacles majeurs. Examinons les avantages de Python dans ce contexte.
- Python est un langage de choix pour l’automatisation des tâches.
- Il nécessite moins de lignes de code comparé à d’autres langages de programmation.
- Python est compatible avec la plupart des systèmes d’exploitation. Un même script peut être exécuté sous Windows, Linux et macOS.
- Python propose un module nommé « os » qui facilite l’interaction avec le système d’exploitation. Nous allons l’utiliser pour mener à bien notre processus d’automatisation de la suppression de fichiers.
Avec Python, il est possible de remplacer toutes les tâches système répétitives ou ennuyeuses par des scripts automatisés. La création d’un script pour une tâche système spécifique est un jeu d’enfant si vous maîtrisez Python. Explorons l’exemple d’utilisation suivant.
Note : Les scripts présentés ont été testés avec Python 3.6 et versions ultérieures.
Suppression de fichiers/dossiers datant de plus de X jours
Il arrive fréquemment que les anciens fichiers journaux perdent leur utilité et qu’il soit nécessaire de les supprimer régulièrement pour libérer de l’espace de stockage. Cela peut s’appliquer à d’autres types de fichiers également.
Le module « os » fournit une méthode appelée « stat » qui donne des informations sur la dernière heure d’accès (st_atime), de modification (st_mtime) et de changement des métadonnées (st_ctime). Ces informations sont exprimées en secondes écoulées depuis l’époque (epoch). Pour plus de détails sur l’époque, vous pouvez consulter cette ressource.
Pour parcourir tous les sous-dossiers d’un répertoire, nous utiliserons la méthode « os.walk(path) ».
Voici les étapes à suivre pour écrire un script qui supprimera les fichiers et dossiers en fonction de leur ancienneté.
- Importer les modules « time », « os » et « shutil ».
- Définir les variables pour le chemin du répertoire et le nombre de jours.
- Convertir le nombre de jours en secondes en utilisant la méthode « time.time() ».
- Vérifier si le chemin spécifié existe en utilisant « os.path.exists(path) ».
- Si le chemin existe, obtenir la liste des fichiers et des répertoires présents à cet endroit, incluant les sous-répertoires. Utiliser « os.walk(path) » qui retourne un générateur contenant les dossiers, fichiers et sous-dossiers.
- Construire le chemin complet de chaque fichier et dossier en combinant le chemin actuel et le nom du fichier/dossier grâce à « os.path.join() ».
- Obtenir la date de création (ctime) de chaque élément à l’aide de « os.stat(path).st_ctime ».
- Comparer le ctime avec la date limite que nous avons calculée.
- Si l’âge d’un élément dépasse la limite définie, vérifier si c’est un fichier ou un répertoire. Si c’est un fichier, utiliser « os.remove(path) », sinon, utiliser « shutil.rmtree() » pour supprimer le répertoire et son contenu.
- Si le chemin n’existe pas, afficher un message indiquant qu’il n’a pas été trouvé.
Examinons le code en détail.
# Importation des modules nécessaires import os import shutil import time # Fonction principale def main(): # Initialisation des compteurs deleted_folders_count = 0 deleted_files_count = 0 # Spécification du chemin path = "/CHEMIN_A_SUPPRIMER" # Spécification du nombre de jours days = 30 # Conversion des jours en secondes # time.time() renvoie le temps actuel en secondes seconds = time.time() - (days * 24 * 60 * 60) # Vérification de l'existence du chemin if os.path.exists(path): # Parcours de chaque dossier et fichier dans le chemin for root_folder, folders, files in os.walk(path): # Comparaison avec le nombre de jours if seconds >= get_file_or_folder_age(root_folder): # Suppression du dossier remove_folder(root_folder) deleted_folders_count += 1 # Incrémentation du compteur # Arrêt après la suppression du dossier racine break else: # Vérification des dossiers à partir du dossier racine for folder in folders: # Chemin du dossier folder_path = os.path.join(root_folder, folder) # Comparaison avec le nombre de jours if seconds >= get_file_or_folder_age(folder_path): # Appel de la fonction remove_folder remove_folder(folder_path) deleted_folders_count += 1 # Incrémentation du compteur # Vérification des fichiers du répertoire courant for file in files: # Chemin du fichier file_path = os.path.join(root_folder, file) # Comparaison avec le nombre de jours if seconds >= get_file_or_folder_age(file_path): # Appel de la fonction remove_file remove_file(file_path) deleted_files_count += 1 # Incrémentation du compteur else: # Si le chemin n'est pas un répertoire # Comparaison avec le nombre de jours if seconds >= get_file_or_folder_age(path): # Appel de la fonction remove_file remove_file(path) deleted_files_count += 1 # Incrémentation du compteur else: # Fichier/dossier non trouvé print(f'"{path}" n\'a pas été trouvé') deleted_files_count += 1 # Incrémentation du compteur print(f"Nombre total de dossiers supprimés : {deleted_folders_count}") print(f"Nombre total de fichiers supprimés : {deleted_files_count}") def remove_folder(path): # Suppression du dossier if not shutil.rmtree(path): # Message de succès print(f"{path} a été supprimé avec succès") else: # Message d'échec print(f"Impossible de supprimer {path}") def remove_file(path): # Suppression du fichier if not os.remove(path): # Message de succès print(f"{path} a été supprimé avec succès") else: # Message d'échec print(f"Impossible de supprimer {path}") def get_file_or_folder_age(path): # Obtention du ctime du fichier/dossier # Le temps sera en secondes ctime = os.stat(path).st_ctime # Renvoi du temps return ctime if __name__ == '__main__': main()
Dans le code ci-dessus, vous devez ajuster les deux variables suivantes en fonction de vos besoins:
days = 30 path = "/CHEMIN_A_SUPPRIMER"
Suppression de fichiers dépassant X Go
Ce script permet de rechercher et de supprimer des fichiers dont la taille excède une valeur définie. Il s’inspire du script précédent, mais au lieu de prendre l’âge comme critère, nous allons utiliser la taille du fichier.
# Importation du module os import os # Fonction qui renvoie la taille d'un fichier def get_file_size(path): # Obtention de la taille du fichier en octets size = os.path.getsize(path) # Renvoi de la taille du fichier return size # Fonction pour supprimer un fichier def remove_file(path): # Suppression du fichier if not os.remove(path): # Succès print(f"{path} a été supprimé avec succès") else: # Erreur print(f"Impossible de supprimer {path}") def main(): # Spécification du chemin path = "ENTRER_CHEMIN_ICI" # Taille maximale du fichier en Mo size = 500 # Vérification de l'existence du chemin if os.path.exists(path): # Conversion de la taille en octets size = size * 1024 * 1024 # Parcours des sous-dossiers for root_folder, folders, files in os.walk(path): # Parcours de la liste des fichiers for file in files: # Obtention du chemin du fichier file_path = os.path.join(root_folder, file) # Vérification de la taille du fichier if get_file_size(file_path) >= size: # Appel de la fonction remove_file remove_file(file_path) else: # Vérification uniquement si le chemin est un fichier if os.path.isfile(path): # Le chemin n'est pas un dossier # Vérification du fichier directement if get_file_size(path) >= size: # Appel de la fonction remove_file remove_file(path) else: # Le chemin n'existe pas print(f"{path} n'existe pas") if __name__ == '__main__': main()
N’oubliez pas d’adapter les deux variables suivantes :
path = "ENTRER_CHEMIN_ICI" size = 500
Suppression de fichiers avec une extension spécifique
Dans certains cas, vous pourriez vouloir supprimer des fichiers en fonction de leur extension, par exemple les fichiers .log. La méthode « os.path.splitext(path) » permet de récupérer l’extension d’un fichier. Elle retourne un tuple contenant le chemin et l’extension du fichier.
# Importation du module os import os # Fonction principale def main(): # Spécification du chemin path = "CHEMIN_A_RECHERCHER" # Spécification de l'extension extension = ".log" # Vérification de l'existence du chemin if os.path.exists(path): # Vérification du type de chemin (dossier ou non) if os.path.isdir(path): # Parcours des sous-dossiers for root_folder, folders, files in os.walk(path): # Vérification des fichiers for file in files: # Chemin du fichier file_path = os.path.join(root_folder, file) # Extraction de l'extension du nom de fichier file_extension = os.path.splitext(file_path)[1] # Vérification de l'extension du fichier if extension == file_extension: # Suppression du fichier if not os.remove(file_path): # Message de succès print(f"{file_path} supprimé avec succès") else: # Message d'échec print(f"Impossible de supprimer {file_path}") else: # Le chemin n'est pas un dossier print(f"{path} n'est pas un dossier") else: # Le chemin n'existe pas print(f"{path} n'existe pas") if __name__ == '__main__': # Appel de la fonction principale main()
N’oubliez pas d’adapter le chemin et la variable de l’extension à vos besoins.
Il est recommandé de tester ces scripts dans un environnement de non-production. Une fois que vous êtes satisfait des résultats, vous pouvez les planifier via cron (si vous utilisez Linux) afin qu’ils s’exécutent périodiquement pour des opérations de maintenance. Python est idéal pour ce genre de tâches. Si vous souhaitez approfondir vos connaissances, ce cours Udemy pourrait vous intéresser.
Cet article vous a plu ? Pourquoi ne pas le partager ?