Scripts Python pour supprimer les fichiers régulièrement
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 ?