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 ?