#1 Le 25/10/2008, à 21:33
- yurek
L'équivalent d'un script bash en python
J'ai écris un script qui me permet de supprimer des photos que j'ai en double dans un dossier.
Le script ajoute des espaces aux fichiers ayant des espaces, ( meme si grace a la trilogie j'ai remédié a ce probleme merci ) puis déplace les doubles ( ayant les meme tailles ) dans un dossier "doublons"
#!/bin/bash
if [ -z "$1" ] ; then
echo Usage: $0 /folder_to_work/
exit 400;
fi
FIC_TMP=/tmp/$$
cd "$1"
mkdir -p doublons
find . -maxdepth 1 -type f -exec rename "y/\ /_/" {} \;
ls -1lS | egrep "JPG|jpg|jpeg|JPEG|png|PNG"| sed /^$/d | while read droit some name group size date hour file ;
do
echo $size $file ;
done > $FIC_TMP
sort $FIC_TMP > ${FIC_TMP}2
mv ${FIC_TMP}2 $FIC_TMP
# chaque fichier doublon aura la même signature que celui du dessus
OLD_SIGN=""
OLD_FICHIER=""
cat ${FIC_TMP} | while read SIGNATURE FICHIER
do
if [ "$OLD_SIGN" = "$SIGNATURE" ]; then
echo "Fichier $FICHIER a un double : $OLD_FICHIER"
mv "$OLD_FICHIER" doublons/
fi
OLD_SIGN=$SIGNATURE
OLD_FICHIER=$FICHIER
done
rm $FIC_TMP
cd -
exit 0;
Dernière modification par yurek (Le 26/10/2008, à 22:11)
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#2 Le 25/10/2008, à 23:12
- alexduf
Re : L'équivalent d'un script bash en python
Salut,
le bash gère aussi les espace, il faut juste faire attention à deux ou trois pièges.
le script que tu as écris fonctionne donc certainement moyennant quelques modif.
Cependant, je me suis permis d'écrire un petit script qui vérifie les doublons à partir de leur MD5 et non de leur taille (ce qui évite les faux doublons, genre deux photos differente mais de même taille)
si ça te tente :
[edit] il demande d'avoir md5sum d'installé (je sais pas si c'est le cas par défaut)[/edit]
#!/bin/bash
# extension à traiter
EXTENSIONS="JPG jpg jpeg JPEG png PNG"
# fichier temporaire utilisé pendant le traitement
FIC_TMP=/tmp/$$
# calcul de la signature de chaque fichier
for EXT in $EXTENSIONS
do
ls -1 *.$EXT 2>/dev/null | while read FICHIER
do
md5sum "$FICHIER" >> $FIC_TMP
done
done
# tri sur la signature
sort $FIC_TMP > ${FIC_TMP}2
mv ${FIC_TMP}2 $FIC_TMP
# chaque fichier doublon aura la même signature que celui du dessus
OLD_SIGN=
cat ${FIC_TMP} | while read SIGNATURE FICHIER
do
if [ "$OLD_SIGN" = "$SIGNATURE" ]; then
echo "Fichier $FICHIER en double"
mv "$FICHIER" doublons/
fi
OLD_SIGN=$SIGNATURE
done
rm $FIC_TMP
Dernière modification par alexduf (Le 25/10/2008, à 23:16)
Hors ligne
#3 Le 25/10/2008, à 23:43
- yurek
Re : L'équivalent d'un script bash en python
Intéressant, la combinaison du | while read est très astucieuse , j'y aurait jamais pensé !!
maintenant j'ai pas compris l'utilité de :
# tri sur la signature
sort $FIC_TMP > ${FIC_TMP}2
Sinon le script est bien plus rapide, quelques secondes !! Le mien mettait près d'une minute pour 100 photo,
Avec le hash je me demande si on peux paramétrer la chose pour qu'elle puissent "soupçonner" la ressemblance entre deux photos ?? Sur les différences entre deux hash... Je vais chercher.
Merci beaucoup en tout cas.
Dernière modification par yurek (Le 26/10/2008, à 00:00)
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#4 Le 26/10/2008, à 11:12
- alexduf
Re : L'équivalent d'un script bash en python
Intéressant, la combinaison du | while read est très astucieuse , j'y aurait jamais pensé !!
Héhé
maintenant j'ai pas compris l'utilité de :
# tri sur la signature
sort $FIC_TMP > ${FIC_TMP}2
En fait j'ai constitué un fichier qui contient deux colonnes, une pour le hash, une avec le nom du fichier. Si on fait un tri sur le hash, on trouvera en un seul parcours du fichier les fichiers similaires, puisqu'ils seront tous à la suite :
hash fichier
aaaa toto.jpg
ffff titi.jpg
eeee tutu.jpg
aaaa copie de toto.jpg
hash fichier
aaaa toto.jpg
aaaa copie de toto.jpg
eeee tutu.jpg
ffff titi.jpg
Ya plus qu'à parcourir et regarder si le hash est le même que celui du dessus.
Avec le hash je me demande si on peux paramétrer la chose pour qu'elle puissent "soupçonner" la ressemblance entre deux photos ?? Sur les différences entre deux hash... Je vais chercher.
Là je suis catégorique la réponse est non ^_^. Avec le md5 (ou crc ou sha ...), le moindre bit de changé te bouleversera complètement la signature de ton fichier (et c'est le but d'ailleurs). Après il existe peut-être d'autres signatures que le md5 qui prennent en compte la ressemblance de deux images, mais à mon avis c'est le genre d'algo bien copieux à programmer.
Merci beaucoup en tout cas.
avec plaisir, ça faisait un moment que j'avais rien codé en bash
Hors ligne
#5 Le 26/10/2008, à 12:48
- geenux
Re : L'équivalent d'un script bash en python
Sinon pour gérer simplement les espaces en bash, il y a la variable IFS qui permet de définir le séparateur.
IFS="
"
#ou IFS="\n"
Pour prendre le retour à la ligne comme caractère de séparation
et
IFS=" "
Pour remettre l'espace.
Donc pour ton script, il suffit de rajouter
IFS="
"
Au début, et le problème d'espace sera réglé.
Hors ligne
#6 Le 26/10/2008, à 13:16
- yurek
Re : L'équivalent d'un script bash en python
Oui ce matin j'ai eu un flash et je me suis dis que le second while ne faisait pas toutes les comparaison dont qu'il fallais reprendre le for. Mais ton sort régle le probleme donc je comprend mieux comment seul une comparaison entre deux signatures suffit.
Je crois que je fais faire la meme chose avec mon script et je vais combiner les deux, si une photo est retourné le hash change mais pas la taille. Vu que geenux m'a donné ma solution.
Merci énormément a vous deux.
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#7 Le 26/10/2008, à 13:21
- alexduf
Re : L'équivalent d'un script bash en python
si une photo est retourné le hash change mais pas la taille.
Hmm j'ai bien peur que ça dépende vraiment des cas. Dans le cas du jpeg, ça change beaucoup de choses!
Hors ligne
#8 Le 26/10/2008, à 22:09
- yurek
Re : L'équivalent d'un script bash en python
Hmm, ok je crois que je vais m'arrêter la en tout cas,
Sinon pour le script je vais m'appuyer sur la taille du fichier car le hash md5 ralentit les choses, et j'utilise la trilogie : pipe while read qui est un truc fabuleux, je vais modifier tous mes scripts avec ca c'est GÉNIAL...
Script GPL v2.
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#9 Le 26/10/2008, à 23:20
- alexduf
Re : L'équivalent d'un script bash en python
pipe while read qui est un truc fabuleux, je vais modifier tous mes scripts avec ca c'est GÉNIAL..
huhu, c'est aussi très pratique pour interpréter les résultats d'une requête sql à la volée. J'ai l'habitude de bosser avec sqlplus au boulot et ça permet de faire des choses assez chiadées.
En tout cas heureux que le tuyau te plaise, c'est le genre de truc qui laisse indifférent un bon 99.9% de la population ^_^
Hors ligne