Wiki Root66

Le Wiki de Root66, tuto, infos et astuces

Outils pour utilisateurs

Outils du site


purger_des_fichiers_et_des_dossiers_d_une_corbeille

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.

#!/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()

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 :

python /usr/local/bin/purgecorbeille.py

ou avec un peu de chance :

purgecorbeille.py

(ç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 :

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

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 :

/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

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 :

# 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

L'option “–all” est nécessaire pour les “sockets”, sinon ils ne sont pas purgés.

Bon ménage !
;-)

purger_des_fichiers_et_des_dossiers_d_une_corbeille.txt · Dernière modification : 2021/10/18 16:09 de 127.0.0.1