Rechercher : dans
Par :

[Shell] Suppression de versions de fichier

Dernière réponse le 16 avr 2009 à 15:51:19 zeratool, le 15 avr 2009 à 17:36:09 
 Signaler ce message aux modérateurs

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

Configuration: Linux Ubuntu
Firefox 3.0.8

Meilleures réponses pour « [Shell] Suppression de versions de fichier » dans :
[Windows] Impossible de supprimer un fichier ou un dossier Voir Si Windows n'arrive pas à supprimer un fichier ou un dossier, la cause peut être l'une des suivantes : Le fichier ou le dossier à supprimer est utilisé par un processus du système Le dossier à supprimer contient des fichiers ou dossiers cachés ...
[Windows/Corbeille] Supprimer un fichier sans confirmation Voir Vous en avez assez de vider continuellement votre corbeille ? Il est possible de supprimer les fichiers sans passer par la corbeille de deux façons différentes : Méthode manuelle Méthode automatique Méthode manuelle Pour ne plus avoir à...
[MacOS X] Supprimer les fichiers récalcitrants VoirIl vous arrive peut-être parfois de vouloir vider la corbeille et que les fichiers ou dossiers que vous voulez supprimer y restent, refusent de disparaître. Pour résoudre ce problème, utilisez une commande UNIX dans le Terminal. Note : ATTENTION...
Supprimer un fichier contenant des caractères spéciaux VoirSi le fichier que vous souhaitez supprimer commence par un caractère "moins" (-), la commande rm risque de prendre la suite comme une option de la ligne de commande. Pour y remédier, une première solution consiste à faire précéder le nom du...

1

jipicy, le 15 avr 2009 à 17:44:13

Salut,

Tu pourrais poster un listing histoire qu'on voit un peu mieux... honnêtement j'ai la flemme de créer une liste ;-(
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

2

zeratool, le 15 avr 2009 à 18:19:44

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.

Répondre à zeratool

3

jipicy, le 15 avr 2009 à 20:37:06

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.

Répondre à jipicy

4

zeratool, le 16 avr 2009 à 14:30:06

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

Répondre à zeratool

5

jipicy, le 16 avr 2009 à 14:44:52

Merci à toi pour la récapitulation ;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

6

 zeratool, le 16 avr 2009 à 15:51:19

Oupps coquilles dans le script
Il faut >> $dir/final.txt et non >> final.txt
Cordialement,

Répondre à zeratool