Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/10/2008, à 22: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, à 23: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 26/10/2008, à 00: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 26/10/2008, à 00:16)

Hors ligne

#3 Le 26/10/2008, à 00: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, à 01: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, à 12:12

alexduf

Re : L'équivalent d'un script bash en python

yurek a écrit :

Intéressant, la combinaison du | while read est très astucieuse , j'y aurait jamais pensé !!

Héhé cool

yurek a écrit :

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.

yurek a écrit :

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.

yurek a écrit :

Merci beaucoup en tout cas.

avec plaisir, ça faisait un moment que j'avais rien codé en bash big_smile

Hors ligne

#5 Le 26/10/2008, à 13: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, à 14: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, à 14:21

alexduf

Re : L'équivalent d'un script bash en python

yurek a écrit :

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, à 23: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 27/10/2008, à 00:20

alexduf

Re : L'équivalent d'un script bash en python

yurek a écrit :

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