Efacer contenu d'un dossier par date

Plopy -  
 Plopy -
Bonjour,

je souhaiterais créer un script pour effacer le contenu d'un dossier précis, mais pas tout son contenu, seulement celui dont la date est inférieure à 5 jours (J-5).

Par exemple, j'ai mon dossier /home/user/repertoire/backups/ avec plein de dossiers (1 dossiers est crée par backup) et à l'interieur de ces dossiers il a plain de fichiers.

Ce que je veux c'est pouvoir effacer les dossiers dans /home/user/repertoire/backups/ (avec tout leur contenu) dont la date de création est J-5.

Voila si vous pouvez m'aider.
Merci d'avance.

5 réponses

  1. jivef Messages postés 1024 Statut Membre 306
     
    Bonjour,
    En fait, il y a un conseil que je voudrais te donner pour que tes dossiers soient toujours classés dans un ordre chronologique lorsque tu les listes :
    Remplace
    NOW="$(date +"%d-%m-%Y_%Hh%M")"
    par
    NOW="$(date +"%Y-%m-%d_%Hh%M")"

    Pour la suite, voici un script qui fait exactement ce que tu veux et que j'ai mis en place il y a quelques mois :

    Je créé des sauvegardes sur un disque USB, leur nom commence par savYYYYMMJJ
    Je ne garde que 30 jours de sauvegarde, donc je fais ceci :

    #suppression des sauvegardes de plus de 30 jours.
    find /media/usbdsk -ctime +30 -type d -name sav* -exec rm -r {} \;
    ls -R /media/usbdsk/$vardate > /usr/scripts/sauvegarde.log

    Donc pour supprimer les fichiers de sauvegardes de plus de 5 jours, tu transforme le 30 en 5.

    Si tu veux, pour la forme, je te mets le script intégral en dessous :
    Certains choix peuvent te paraître bizarres, mais je suis le seul à travailler sur systèmes Unix ou GNU/Linux dans ma société et si je veux que mes collègues soient capables faire une restauration sans m'appeler, il faut faire simple.

    #!/bin/bash
    # Script de sauvegarde du dossier /home
    #echo definition de la variable de date servant creer les repertoires de sauvegarde
    vardate=sav'date +%Y%m%d%H%M'
    echo $vardate
    sleep 2
    # montage du disque
    mount /dev/sdb1 /media/usbdsk -o rw
    case $? in
    0) echo "le montage a fonctionne."
    ;;
    *) echo "erreur de montage du volume de sauvegarde, peut-etre etait-il deja monte..."
    ;;
    esac
    # verification du montage du disque :
    mount | grep "/dev/sdb1 on /media/usbdsk type vfat (rw)"
    case $? in
    0) echo "le disque est present"
    ;;
    *) mutt -s "Sauvegarde SAT - GNU/Linux - disque non monte " sauvegarde@mondomaine.pf < /usr/scripts/mounterreur.txt
    sleep 5
    exit 0
    ;;
    esac
    mkdir -p /media/usbdsk/$vardate
    echo $?
    echo ci-dessus resultat mkdir
    sleep 2
    # Ci dessous ligne permettant de creer un dossier identique a celui d'origine avec cpio
    find /home/* | cpio -pmd /media/usbdsk/$vardate
    sleep 2
    echo suppression des sauvegardes de plus de 30 jours.
    find /media/usbdsk -ctime +30 -type d -name sav* -exec rm -r {} \;
    ls -R /media/usbdsk/$vardate > /usr/scripts/sauvegarde.log
    mutt -s "Sauvegarde SAT - GNU/Linux" sauvegarde@mondomaine.pf < /usr/scripts/sauvegarde.log
    umount /media/usbdsk
    sleep 10
    /sbin/shutdown -h +45 "Attention arret du serveur dans 45 secondes. - Seul root peut annuler avec shutdown -c "

    Ne t'étonne pas si j'arrête le serveur après la sauvegarde, c'est simplement parce qu'à Tahiti, il y a certains endroit où les coupures de courant sont très fréquentes, de plus ici, l'électricité est principalement d'origine thermique, donc polluante.



    Une idée reçue est souvent une idée morte.
    1
  2. jeanbi Messages postés 15399 Date d'inscription   Statut Contributeur Dernière intervention   2 383
     
    bonjour,

    Exemple: 
    Rechercher (find) à partir du répertoire courant (.) sans inclure les sous-répertoires (-maxdepth 1) tous les fichiers classiques (-type f) de l'utilisateur vandit (-user vandit) "créé" (dernière modification du statut) il y'a plus de 30*24h (Lorsque find calcule le nombre de période de 24 heures la partie fractionnelle est ignorée. Ainsi, pour correspondre à -ctime +1, un fichier doit avoir au moins deux jours)(-ctime +29) et supprimer les fichiers trouvés (-exec rm {} \;) 
    
    $ find . -maxdepth 1 -type f -user vandit -ctime +29 -exec rm {} \; 
    
    
    

    peut etre ça ...
    a+
    ps : en attendant le passage des pro du script je ne nommerai personne :-)
    FC 13 - Mandriva 2010 -Debian squeeze-
    Les meilleures choses ont besoin de patience.(JC ANGLADE)
    penser aux astuces
    0
  3. Plopy
     
    Alors je vais essayer d'aller droit au but ce sera plus simple ;=)

    J'ai le script suivant:

    #!/bin/bash
    
    Mysql_User="user"
    Mysql_Paswd="passwd"
    Mysql_host="localhost"
    MYSQL="$(which mysql)"
    MYSQLDUMP="$(which mysqldump)"
    CHOWN="$(which chown)"
    CHMOD="$(which chmod)"
    GZIP="$(which gzip)"
    
    DEST="/home/user/backups/backup_sql/"
    
    NOW="$(date +"%d-%m-%Y_%Hh%M")"
    
    DEST_mysql="$DEST/$NOW"
    
    IGGY=""
    
    FILE=""
    DBS=""
    
    echo "Début de la sauvegarde et compression du serveur MySQL $Mysql_User vers $DEST"
    date
    echo
    
    # On crée le répertoire défini précédemment
    [ ! -d $DEST_mysql ] && mkdir -p $DEST_mysql || :
    
    # On limite l'accés au root uniquemment si nécessaire (dé-commenter les deux lignes)
    #$CHOWN 0.0 -R $DEST_mysql
    #$CHMOD 0600 $DEST_mysql
    
    # On liste les bases de données associés au compte défini en début de script
    DBS="$($MYSQL -u $Mysql_User -h $Mysql_host -p$Mysql_Paswd -Bse 'show databases')"
    
    for db in $DBS
    do
        skipdb=-1
        if [ "$IGGY" != "" ];
        then
            for i in $IGGY
            do
                [ "$db" == "$i" ] && skipdb=1 || :
            done
        fi
    
        if [ "$skipdb" == "-1" ] ; then
            FILE="$DEST_mysql/$db.$NOW.gz"
            # On boucle, on dump toutes les bases de données et on les compresse individuellement avant sauvegarde sur le FTP
            $MYSQLDUMP -u $Mysql_User -h $Mysql_host -p$Mysql_Paswd $db | $GZIP -9 > $FILE
        fi
    done
    
    # Enregistrement de l'heure de finalisation du processus
    echo "Sauvegarde MySQL du compte $Mysql_User terminée !"
    date
    echo
    
    # Listing des fichiers et vérification des tailles
    ls -lh $DEST
    


    Donc comme vous le voyez le fonctionnement est simple; il se connecte au serveur MySQL pour sauvegarder les bases une à une en TGZ sur un dossier avec pour nom la date et heure. Donc a chaque fois que le crontab est exécuté, un nouveau dossier est crée à l'intérieur de $DEST.

    Ce que je veux c'est que, AVANT l'exécution de la sauvegarde (l'echo dans le script) il scanne le dossier DEST à la recherche de dossiers en J-5 et les efface tous. Ce qui me permet de toujours avoir une copie de sauvegarde de mon SQL en J-5.

    Voila, et si le script en état peut vous servir tant mieux ;)
    0
  4. Plopy
     
    Si jeanbi ou un autre pouvait me confirmer l'adaptation du code a mon script ce serait sympa.

    Merci à vous.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Plopy
     
    Je te remerci pour ton code, je vais essayer de l'adapter à mes besoins. ;)
    0