Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

purger_des_fichiers_et_des_dossiers_d_une_corbeille [2008/06/15 20:14]
jlduflot créée
purger_des_fichiers_et_des_dossiers_d_une_corbeille [2017/02/21 15:10] (version actuelle)
Ligne 1: Ligne 1:
 +====== Introduction ======
 +Cet article présente un outil de purge de corbeille d'utilisateur Linux, avec élimination automatique des seuls fichiers et dossiers qui y ont été mis au-delà d'une certaine durée de rétention.
 +
 +On ne pense pas toujours à faire le ménage dans les corbeilles des utilisateurs d'un PC, et à la longue les fichiers contenus peuvent représenter plusieurs Giga-Octets. Il existe bien au niveau de chaque utilisateur une option pour vider sa corbeille, mais :
 +
 +  * c'est à chaque utilisateur de penser à faire son ménage,
 +  * le ménage est radical, tout est supprimé : il n'y a pas d'option de suppression partielle selon une date ou durée de rétention.
 +
 +**Important : Cet outil fonctionne sur les Linux dont les corbeilles sont structurées en 2 sous-dossiers** :
 +
 +    * **'files'** : fichiers et dossiers effectivement mis dans la corbeille
 +    * **'info'**  : petits fichiers correspondant aux noms mis dans 'files', avec un suffixe '.trashinfo'; ces fichiers précisent notamment l'emplacement d'origine des fichiers et dossiers de la corbeille. Les dates de ces fichiers sont à la base du traitement de cet outil.
 +
 +Cet outil peut être utilisé manuellement, mais peut aussi être inséré dans des tâches **'cron'** automatisées, afin d'effectuer une purge systématique pour tous les utilisateurs, en ne leur laissant que les fichiers et dossiers supprimés depuis moins d'un certain nombre de jours fixé.
 +
 +Une petite remarque en passant : on parle bien de la date de mise à la corbeille, et non de la date de l'objet mis à la corbeille; on pourra par exemple mettre à la corbeille un fichier vieux de 5 ans, mais si cette suppression est très récente on gardera le fichier dans la corbeille tant que la durée de rétention n'est pas dépassée.
 +
 +A la fin de l'article on verra aussi un exemple d'utilisation de l'outil système **tmpwatch**, afin d'opérer d'autres purges non effectuées par défaut dans les dossiers des utilisateurs.
 +
 +**Attention : ** l'auteur de l'article et www.root66.net déclinent toute responsabilité en cas d'utilisation impropre de ce script avec perte de données. Comme tout outil de purge il convient d'effectuer des tests méticuleux sur des données sans importance avant de s'en servir sur des données à effacer réellement du disque.
 +
 +Article rédigé par Jeanmm 8-)\\
 +Version initiale : 3/7/2006.
 +
 +====== Le script Python ======
 +
 +Ne perdons pas de temps ! Voici le script, et pour les explications voir les commentaires inclus et le paragraphe qui suit le script.
 +
 +<code Python>
 +#!/usr/bin/python 
 +# -*- coding: iso-8859-1 -*-
 +"""
 +Ce module est un outil de purge de corbeille d'utilisateur Linux, avec élimination
 +des fichiers et dossiers qui y ont été mis au-delà d'une certaine durée de rétention.
 +
 +Il fonctionne pour les dossiers de corbeille contenant les 2 sous-dossiers :
 +
 +    - 'files' : fichiers et dossiers effectivement mis dans la corbeille
 +
 +    - 'info'  : petits fichiers correspondants aux noms mis dans 'files', avec un
 +                suffixe '.trashinfo'; ces fichiers précisent notamment l'emplacement
 +                d'origine des fichiers et dossiers de la corbeille. Les date de ces
 +                fichiers sont à la base du traitement de cet outil.
 +
 +Arguments d'appel optionnels :
 +
 +    -c nom-du-dossier-corbeille    (par défaut : '/home/utilisateur/.local/share/Trash')
 +    -d duree-de-retention-en-jours (par défaut : 40)
 +    -v pour le mode verbeux        (par défaut : non)
 +
 + Version initiale : 02/07/2006
 + Auteur  : Jeanmm
 + Licence : GPL
 + Lien    : www.root66.net
 +"""
 +
 +import sys, os, shutil, time
 +
 +# Parametres par défaut du programme
 +
 +dureeParDefaut = 40 # en jours
 +corbeilleParDefaut = os.path.join(os.getenv('HOME'), '.local/share/Trash')
 +verbeux = 0
 +
 +# Procedure de purge
 +
 +def PurgeCorbeille():
 +
 +    # Parametres
 +    global dureeParDefaut, corbeilleParDefaut, verbeux
 +    duree = dureeParDefaut
 +    corbeille = corbeilleParDefaut
 +    x=len(sys.argv)
 +    if x>0:
 +        for i in range(x):
 +            # Nom du dossier corbeille
 +            if sys.argv[i] == '-c' and i < x-1:
 +                corbeille = sys.argv[i+1]
 +            # Durée de rétention
 +            elif sys.argv[i] == '-d' and i < x-1:
 +                try:
 +                    duree = int(sys.argv[i+1])
 +                except:
 +                    print "La duree '%s' est invalide !" %(sys.argv[i+1])
 +                    sys.exit(1)
 +            # Mode verbeux
 +            elif sys.argv[i] == '-v':
 +                verbeux = 1
 +            # Help
 +            elif sys.argv[i] == '-h' or sys.argv[i] == 'help' or sys.argv[i] == '--help':
 +                print "Cet outil purge une corbeille, avec elimination des fichiers et dossiers"
 +                print "qui y ont ete mis au-dela d'une certaine duree de retention."
 +                print "Arguments possibles :"
 +                print "  -c nom-du-dossier-corbeille (par defaut : %s)" %(corbeilleParDefaut)
 +                print "  -d duree-de-retention (par defaut : %d, en jours)" %(dureeParDefaut)
 +                print "  -v pour le mode verbeux (par defaut : non)"
 +                print "Auteur : Jeanmm - www.root66.net"
 +                sys.exit(0)
 +
 +    if not duree > 0:
 +        duree = dureeParDefaut
 +    if not os.path.isdir(corbeille):
 +        print "Le dossier '%s' est invalide !" %(corbeille)
 +        sys.exit(1)
 +
 +    # Sous-dossiers 'info' et 'files'
 +    info = os.path.join(corbeille, 'info')  # Dossier des infos de suppression
 +    files = os.path.join(corbeille, 'files') # Dossier des fichiers et dossiers vraiment supprimés
 +
 +    if not os.path.isdir(info):
 +        print 'Le dossier de la corbeille doit comporter un sous-dossier "info" !'
 +        sys.exit(1)
 +    if not os.path.isdir(files):
 +        print 'Le dossier de la corbeille doit comporter un sous-dossier "files" !'
 +        sys.exit(1)
 +
 +    if verbeux:
 +        print 'Dossier de la corbeille : ' + corbeille
 +
 +    # date limite de rétention
 +    t=time.time() - duree * 86400 #date actuelle - duree de retention (en secondes)
 +    if verbeux:
 +        u=time.gmtime(t)
 +        print "Date limite de retention : %02d/%02d/%04d" %(u[2],u[1],u[0])
 +
 +    # Compteur
 +    nbSuppr = 0
 +
 +    # Parcours des noms du dossier info
 +    infos = os.listdir(info)
 +
 +    for xx in infos:
 +        txx = os.path.getmtime(os.path.join(info,xx)) # date de mise dans la corbeille
 +        xxx = os.path.join(files,xx) [0:-10]          # nom de l'objet supprimé, sans suffixe '.trashinfo'
 +
 +        # Purge si date dépassée
 +        if txx < t:
 +            if verbeux:
 +                if nbSuppr == 0:
 +                    print "Suppression de :"
 +                u=time.gmtime(txx)
 +                print "%02d/%02d/%04d : %s" %(u[2],u[1],u[0],xx[0:-10])
 +
 +            # Suppression de l'info
 +            try: os.remove(os.path.join(info,xx))
 +            except: pass
 +
 +            # Suppression d'un fichier
 +            if os.path.isfile(xxx):
 +                try: os.remove(xxx)
 +                except: pass
 +
 +            # ou Suppression d'un dossier
 +            elif os.path.isdir(xxx):
 +                try: shutil.rmtree(xxx)
 +                except: pass
 +
 +            nbSuppr = nbSuppr + 1
 +
 +    if verbeux:
 +        print "Nombre de suppressions : %s" %(nbSuppr)
 +
 +if __name__=='__main__':
 +    PurgeCorbeille()
 +</code>
 +
 +====== Explications ======
 +
 +Il s'agit d'un script Python simple, qui ne nécessite aucun autre script ou logiciel spécial si ce n'est Python lui-même. On pourra en enregistrer une version exécutable dans un dossier d'outils de son PC, par exemple **/usr/local/bin**.
 +
 +Supposons qu'on le nomme **/usr/local/bin/purgecorbeille.py** (le suffixe **.py** est optionnel). On pourra l'appeler par la commande :
 +<code Python>
 +python /usr/local/bin/purgecorbeille.py
 +</code>
 +ou avec un peu de chance :
 +<code Python>
 +purgecorbeille.py
 +</code>
 +(ça dépend de la première ligne du script (le "shebang")).
 +
 +Comme indiqué dans les commentaires on pourra mettre des paramètres. Par défaut le script essaie de supprimer les fichiers et dossiers qui ont été mis dans la corbeille depuis plus de 40 jours.
 +
 +Les arguments d'appel optionnels sont :
 +
 +    * **-c nom-du-dossier-corbeille**    (par défaut : **'/home/utilisateur/.local/share/Trash'**)
 +    * **-d duree-de-retention-en-jours** (par défaut : **40**)
 +    * **-v** pour le mode verbeux        (par défaut : non)
 +
 +Les corbeilles auxquelles on s'attend ici sont donc de la forme **'.local/share/Trash'** avec sous-dossiers **'info'** et **'files'**; si votre Linux gère plutôt des corbeilles du genre 'Desktop/Corbeille', ne cherchez pas, le script ne s'appliquera pas.
 +
 +Les dates de suppressions sont les dates des petits fichiers contenus dans le sous-dossier 'info'. Ces fichiers contiennent notamment les noms d'origine afin de restaurer correctement les fichiers en cas de besoin.
 +
 +Exemple de listage produit en mode verbeux :
 +
 +<code bash>
 +Dossier de la corbeille : /home/denis/.local/share/Trash
 +Date limite de retention : 04/05/2006
 +Suppression de :
 +14/05/2006 : kpackage.desktop
 +21/06/2006 : monimage.jpg
 +17/05/2006 : readme.txt
 +Nombre de suppressions : 3
 +</code>
 +
 +====== Automatisation par 'cron' ======
 +
 +On pourra insérer des commandes de purges dans les scripts appelés par **'cron'**, notamment en complément de purges opérées de manière analogue par l'outil système **'tmpwatch'**. Tmpwatch compte en heures, alors que notre script compte en jours, sinon l'objectif est le même. Exemple de commandes pour un utilisateur nommé denis :
 +
 +<code bash>
 +/usr/sbin/tmpwatch 100 /home/denis/tmp
 +/usr/sbin/tmpwatch --all 100 /home/denis/tmp/orbit-denis
 +/usr/sbin/tmpwatch --all 100 /home/denis/tmp/kde-denis
 +/usr/sbin/tmpwatch --all 100 /home/denis/tmp/ksocket-denis
 +/usr/sbin/tmpwatch 100 /home/denis/.thumbnails/normal
 +/usr/sbin/tmpwatch 100 /home/denis/.thumbnails/large
 +/usr/sbin/tmpwatch 100 /home/denis/.kde/share/config/session
 +/usr/bin/python /usr/local/bin/purgecorbeille.py -c /home/denis/.local/share/Trash
 +</code>
 +
 +Pour les utilisateurs de Mandriva il existe tout simplement un script nommé **tmpwatch** dans l'arborescence déclarée dans **/etc/crontab**. On pourra compléter le script par défaut avec des commandes du type ci-dessus, pour chaque utilisateur du PC. A noter qu'il n'est pas nécessaire dans ce cas de dupliquer les lignes, mais on peux simplement programmer une boucle :
 +
 +<code bash>
 +# Purges de fichiers inutiles
 +UT="toto titi denis paul bibi"
 +for a in $UT;do
 +    /usr/sbin/tmpwatch 100 /home/$a/tmp
 +    /usr/sbin/tmpwatch --all 100 /home/$a/tmp/orbit-$a
 +    /usr/sbin/tmpwatch --all 100 /home/$a/tmp/kde-$a
 +    /usr/sbin/tmpwatch --all 100 /home/$a/tmp/ksocket-$a
 +    /usr/sbin/tmpwatch 100 /home/$a/.thumbnails/normal
 +    /usr/sbin/tmpwatch 100 /home/$a/.thumbnails/large
 +    /usr/sbin/tmpwatch 100 /home/$a/.kde/share/config/session
 +    /usr/bin/python /usr/local/bin/purgecorbeille.py -c /home/$a/.local/share/Trash
 +done
 +</code>
 +
 +L'option "--all" est nécessaire pour les "sockets", sinon ils ne sont pas purgés.
 +
 +Bon ménage !\\
 +;-)
 
 
Sauf mention contraire, le contenu de ce wiki est placé sous la licence suivante:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki