Nettoyer régulièrement le système de fichiers manuellement n'est pas une bonne chose. Automatisez-les !
La suppression manuelle de fichiers et de dossiers n'est pas une tâche passionnante, contrairement à ce que l'on pourrait croire. Il est donc logique de les automatiser.
Python est là pour nous faciliter la vie. Python est un excellent langage de programmation pour les scripts. Nous allons tirer parti de Python pour terminer notre tâche sans encombre. Tout d'abord, vous devez savoir pourquoi Python est un bon choix.
- Python est le langage favori de tous les temps pour l'automatisation des tâches
- Moins de code par rapport à d'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 possède 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 à l'aide de Python. Écrire des scripts pour réaliser une tâche système spécifique est un jeu d'enfant si vous connaissez Python. Examinons le cas d'utilisation suivant.
Note : les exemples suivants ont été testés sur Python 3.6
Suppression de fichiers/dossiers datant de plus de X jours
Souvent, vous n'avez pas besoin de vieux journaux, 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 le dernier accès (st_atime), la dernière modification (st_mtime) et la dernière modification des métadonnées (st_ctime). Toutes les méthodes renvoient le temps en secondes depuis l'époque. Vous trouverez 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 le code de suppression des fichiers/dossiers en fonction du nombre de jours.
- Importez les modules temps, os, shutil
- Attribuez le chemin et les jours aux variables
- Convertissez 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 des dossiers présents dans le chemin, y compris les sous-dossiers. Utilisez la méthode os.walk(path), qui vous renverra un générateur contenant les dossiers, les fichiers et les sous-dossiers
- Obtenez le chemin du fichier ou du dossier en joignant le chemin actuel et le nom du fichier/dossier à l'aide de la méthode os.path.join()
- Obtenez l'heure de début (ctime) ) à partir 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 par l'utilisateur, vérifiez s'il s'agit d'un fichier ou d'un dossier. S'il s'agit d'un fichier, utilisez la méthode os.remove(path) sinon utilisez la méthode shutil.rmtree()
- Si le chemin n'existe pas, affichez le message "not found" (introuvable)
Voyons le code en détail.
# importation des modules nécessaires
import os
import shutil
import time
# fonction principale
def main() :
# initialisation du compte
deleted_folders_count = 0
deleted_files_count = 0
# spécification du chemin
path = "/PATH_TO_DELETE"
# spécification des jours
days = 30
# conversion des jours en secondes
# time.time() renvoie le temps actuel en secondes
seconds = time.time() - (days * 24 * 60 * 60)
# vérifier si le fichier est présent dans le chemin ou non
if os.path.exists(path) :
# itérer sur chaque dossier et fichier du chemin
for root_folder, folders, files in os.walk(path) :
# comparaison des jours
if seconds >= get_file_or_folder_age(root_folder) :
# suppression du dossier
remove_folder(root_folder)
deleted_folders_count = 1 # incrémentation du compte
# rupture après suppression du dossier_racine
break
else :
# vérification du dossier à partir du dossier racine
for folder in folders :
# chemin du dossier
folder_path = os.path.join(root_folder, folder)
# comparaison avec les jours
if seconds >= get_file_or_folder_age(folder_path) :
# invocation de la fonction remove_folder
remove_folder(folder_path)
deleted_folders_count = 1 # incrémentation du compte
# vérification des fichiers du répertoire actuel
for file in files :
# file path
file_path = os.path.join(root_folder, file)
# comparaison des jours
if seconds >= get_file_or_folder_age(file_path) :
# invocation de la fonction remove_file
remove_file(file_path)
deleted_files_count = 1 # incrémentation du compte
else :
# si le chemin n'est pas un répertoire
# comparaison avec les jours
if seconds >= get_file_or_folder_age(path) :
# invocation du fichier
remove_file(path)
deleted_files_count = 1 # incrémentation du compte
else :
# le fichier/dossier n'est pas trouvé
print(f'"{path}" is not found')
deleted_files_count = 1 # incrémentation du compte
print(f "Total folders deleted : {deleted_folders_count}")
print(f "Total des fichiers supprimés : {deleted_files_count}")
def remove_folder(path) :
# supprimer le dossier
if not shutil.rmtree(path) :
# message de succès
print(f"{chemin} est supprimé avec succès")
else :
# message d'échec
print(f "Impossible de supprimer le {chemin}")
def remove_file(path) :
# suppression du fichier
if not os.remove(path) :
# message de succès
print(f"{path} is removed successfully")
else :
# message d'échec
print(f "Unable to delete the {path}")
def get_file_or_folder_age(path) :
# obtention de la durée du fichier/dossier
# la durée sera exprimée en secondes
ctime = os.stat(path).st_ctime
# renvoie le temps
return ctime
if __name__ == '__main__' :
main()
Vous devez ajuster les deux variables suivantes dans le code ci-dessus en fonction de vos besoins.
days = 30
path = "/PATH_TO_DELETE"
Suppression des fichiers d'une taille supérieure à X Go
Recherchons les fichiers dont la taille est supérieure à un certain seuil et supprimons-les. Cette procédure est similaire au script précédent. 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.
# 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"{chemin} est supprimé avec succès")
else :
# erreur
print(f "Impossible de supprimer le {chemin}")
def main() :
# spécifier le chemin
path = "ENTER_PATH_HERE"
# indiquer la taille maximale du fichier en Mo
size = 500
# vérifier si le chemin existe ou non
if os.path.exists(path) :
# convertir la taille en octets
size = size * 1024 * 1024
# parcourir les sous-dossiers
for root_folder, folders, files in os.walk(path) :
# itération sur 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 :
# invocation de la fonction remove_file
remove_file(file_path)
else :
# vérification uniquement si le chemin est un fichier
if os.path.isfile(path) :
# path n'est pas un répertoire
# vérification du fichier directement
if get_file_size(path) >= size :
# invocation de la fonction remove_file
remove_file(path)
else :
# le chemin n'existe pas
print(f"{path} n'existe pas")
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 arriver que vous souhaitiez supprimer des fichiers en fonction de leur extension. Par exemple, un fichier .log
. Vous pouvez trouver l'extension d'un fichier en utilisant la méthode os.path.splitext(path)
. Elle renvoie un tuple contenant le chemin et l'extension du fichier.
# import os module
import os
# main function
def main() :
# spécifier le chemin
path = "PATH_TO_LOOK_FOR"
# spécifier l'extension
extension = ".log"
# vérifier si le chemin existe ou non
if os.path.exists(path) :
# vérifier si le chemin est un répertoire ou non
if os.path.isdir(path) :
# itération dans les sous-dossiers
for root_folder, folders, files in os.walk(path) :
# vérification des fichiers
for file in files :
# chemin d'accès au 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} deleted successfully")
else :
# message d'échec
print(f "Unable to delete the {file_path}")
else :
# le chemin n'est pas un répertoire
print(f"{chemin} n'est pas un répertoire")
else :
# le chemin n'existe pas
print(f"{chemin} n'existe pas")
if __name__ == '__main__' :
# invocation de la fonction principale
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 vous suggère de tester les scripts dans un environnement NON PRODUCTIF. Une fois que vous êtes satisfait des résultats, vous pouvez programmer via cron (si vous utilisez Linux) l'exécution périodique des scripts pour les travaux de maintenance. Python est idéal pour réaliser ce genre de choses et si vous souhaitez apprendre à en faire plus, jetez un œil à ce cours Udemy.