[Shell] Suppression de versions de fichier

Résolu/Fermé
zeratool - 15 avril 2009 à 17:36
 zeratool - 16 avril 2009 à 15:51
Bonjour a tous,
J'aimerais realisé un petit script qui versionne mes fichiers tous les jours a la meme heure et qui ne gardent que 3 increments.
J'utilise rdiff-backup qui generent donc des increments de cette forme:
mon_fichier.son_extension.2009-04-15T16 : 05 : 15+02.00.diff.gz

Au debut j'avais fais un script qui supprimait les versions vieilles de plus de 3 jours (vu que le versionning se passe tous les jours a la même heure) juste après les synchros.le problème c est que si je ne modifie pas un fichier au bout de 4 jours tous ses incréments ont disparus.Alors que j'aimerai garder les "3 plus jeunes versions"
Et la du coup...je lag...
Je pensais faire un enorme fichier texte qui a tous les noms de fichiers (nom de fichier + path) .Ensuite je calcule le nombre d'occurence du noms de fichier (donc regex pour virer ".2009-04-15T16 : 05 : 15+02.00.diff.gz")et des que le nombre d'occurence est > 4 je recupere le nom du fichier,et je supprime le plus vieux...
Sa me parait un peu lourd nan?
merci a tous
A voir également:

4 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2009 à 17:44
Salut,

Tu pourrais poster un listing histoire qu'on voit un peu mieux... honnêtement j'ai la flemme de créer une liste ;-(
0
ok par exemple:

test_1.txt.2009-04-15T09 : 00 : 00+02.00.diff.gz
test_1.txt.2009-04-14T09 : 00 : 00+02.00.diff.gz
test_1.txt.2009-04-12T09 : 00 : 00+02.00.diff.gz
test_1.txt.2009-04-04T09 : 00 : 00+02.00.diff.gz
test_1.txt.2009-04-02T09 : 00 : 00+02.00.diff.gz

test_2.txt.2009-04-15T09 : 00 : 00+02.00.diff.gz
test_2.txt.2009-04-01T09 : 00 : 00+02.00.diff.gz
test_2.txt.2009-03-28T09 : 00 : 00+02.00.diff.gz

Dans cette example il faudrait donc degager:
test_1.txt.2009-04-04T09 : 00 : 00+02.00.diff.gz
test_1.txt.2009-04-02T09 : 00 : 00+02.00.diff.gz

mais pas les
test_2.txt.2009-04-01T09 : 00 : 00+02.00.diff.gz
test_2.txt.2009-03-28T09 : 00 : 00+02.00.diff.gz

Bien qu'ils soient plus vieux.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2009 à 20:37
Le répertoire contenant les archives.
J'ai rajouté quelques archives de plus afin de bien vérifier l'efficacité des commandes.
Il faut donc dégager les fichiers mis en gras ci-dessous :
[tmpfs]$ ls -1v rep/
test_1.txt.2009-04-02T09 : 00 : 00+02.00.diff.gz
test_1.txt.2009-04-04T09 : 00 : 00+02.00.diff.gz
test_1.txt.2009-04-12T09 : 00 : 00+02.00.diff.gz
test_1.txt.2009-04-14T09 : 00 : 00+02.00.diff.gz
test_1.txt.2009-04-15T09 : 00 : 00+02.00.diff.gz
test_2.txt.2009-03-12T09 : 00 : 00+02.00.diff.gz
test_2.txt.2009-03-28T09 : 00 : 00+02.00.diff.gz
test_2.txt.2009-04-01T09 : 00 : 00+02.00.diff.gz
test_2.txt.2009-04-15T09 : 00 : 00+02.00.diff.gz
test_3.txt.2009-03-05T09 : 00 : 00+02.00.diff.gz
test_3.txt.2009-03-16T09 : 00 : 00+02.00.diff.gz
test_3.txt.2009-03-29T09 : 00 : 00+02.00.diff.gz
test_3.txt.2009-04-08T09 : 00 : 00+02.00.diff.gz
test_3.txt.2009-04-22T09 : 00 : 00+02.00.diff.gz


Le script. J'ai préféré ne pas exécuter la commande "rm" directement, mais envoyer l'echo de ce qui devrait être fait, donc enlever les echo si tout va bien...
[tmpfs]$ cat foo.sh
#! /bin/sh

#set -xv

# On récupère le nom des fichiers dont le nombre d'occurrences > 3
ls -1 rep/ | awk -F'-' '{ print $1 }' | uniq -c | awk '{ if ( $1 > 3 ) { print $2 }}' > recup.txt
# On récupère les fichiers les plus anciens pour chaque occurence
while read line
do
ls -1 rep/ | grep "${line}" | sort -t'.' -k 3.6r | sed -n '4,$p' >> final.txt
done < recup.txt
# On supprime les fichiers les plus anciens
while read line
do
echo "rm -f rep/\"${line}\""
done < final.txt
# On supprime les 2 fichiers temporaires
echo "rm -f final.txt recup.txt"

Le résultat :
[tmpfs]$ ./foo.sh
rm -f rep/"test_1.txt.2009-04-04T09 : 00 : 00+02.00.diff.gz"
rm -f rep/"test_1.txt.2009-04-02T09 : 00 : 00+02.00.diff.gz"
rm -f rep/"test_2.txt.2009-03-12T09 : 00 : 00+02.00.diff.gz"
rm -f rep/"test_3.txt.2009-03-16T09 : 00 : 00+02.00.diff.gz"
rm -f rep/"test_3.txt.2009-03-05T09 : 00 : 00+02.00.diff.gz"
rm -f final.txt recup.txt
[tmpfs]$
--
C'est loin d'être optimisé je pense, sûrement qu'il y a mieux à faire...

;-))

$ man woman
Il n'y a pas de page de manuel pour woman.
0
Merci pour ta reponse qui m'a beaucoup inspiré!
J'ai rajouter le fait qu'il puisse y avoir des sous repertoires (choses que j'avais oublié de preciser)
J'ai donc utiliser FIND au lieux de LS ce qui permet en plus de garder le chemin absolu
De plus avec le grep ${line}il suffit qu'un fichier s'apelle my_fic et qu'un autre s'appelle my_ficc pour que la suppression de my_fic entraine celle de my_ficc.J'ai rajouter la regexp qui permet le 1er catch afin d'etre sur de recuperer le bon fichier.
En tout cas pour un script qui s'effectue qu'une fois par jour je pense que c est suffisament leger pour ne pas poser de probleme.
En tout cas merci beaucoup!
Voici le script finale

#! /bin/sh

#Repertoire racine de la recherche
dir=/mondir_a_backuper/

#set -xv

# On récupère le nom des fichiers dont le nombre d'occurrences > 3
find $dir -depth -type f | sed -e 's/.[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}T.*//g' | sort | uniq -c | awk '{ if ( $1 > 3 ) { print $2 }}' >> $dir/recup.txt

# On récupère les fichiers les plus anciens pour chaque occurence
while read line
do
find $dir -depth -type f | grep -e ${line}'.[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}T.*' | sort -t'.' -k 3.6r -r | sed -n '4,$p' >> final.txt
done < $dir/recup.txt

# On supprime les fichiers les plus anciens
while read line
do
rm -f ${line}
done < $dir/final.txt

# On supprime les 2 fichiers temporaires
rm -f $dir/final.txt $dir/recup.txt
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
16 avril 2009 à 14:44
Merci à toi pour la récapitulation ;-))
0
Oupps coquilles dans le script
Il faut >> $dir/final.txt et non >> final.txt
Cordialement,
0