[Shell] Suppression de versions de fichier
Résolu/Fermé
A voir également:
- [Shell] Suppression de versions de fichier
- Forcer suppression fichier - Guide
- Fichier rar - Guide
- Fichier host - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
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
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 ;-(
Tu pourrais poster un listing histoire qu'on voit un peu mieux... honnêtement j'ai la flemme de créer une liste ;-(
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.
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.
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
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 :
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...
Le résultat :
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.
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.
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
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
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
16 avril 2009 à 14:44
Merci à toi pour la récapitulation ;-))