Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
copier des fichiers en les renommant
Envoyé par: distribution

Bonjour,

j'ai un répertoire ~/test qui contient un grand nombre de répertoires qui contiennent chacun un seul fichier image (.jpg)

je souhaite copier tous ces fichiers ailleurs dans un même répertoire en les renommant .la syntaxe des fichiers est de la forme : "numéroproduit-descriptionproduit.jpg" et je souhaite les renommer en "numéroproduit.jpg"
" pour cela j'utilise la commande mcp de la façon suivante

(1) : $mcp ~/test/*/"*-*.jpg" ~/test/"#2.jpg"

ça fonctionne .

par contre j'ai un petit soucis qui est le suivant . dans le grand nombre de répertoire deux (ou plus) répertoires peuvent contenir le même nom de fichier car ils représentent la même image mais avec des tailles différentes (car pas la même résolution ) . Si j'applique la ligne de commande du dessus (1 ) telle quelle j'obtiens des messages de " collision " :

/home/hadron/test/repertoire1/nomproduit-descriptionproduit.jpg , /home/hadron/test/repertoire2/nomproduit-descriptionproduit.jpg -> /home/hadron/test/nomproduit.jpg : collision.


ma question : y a t il moyen dans la ligne de commande (1) d'ajouter une commande qui permettrait quand il y a doublon de comparer en fonction de la taille du fichier pour choisir uniquement le plus gros fichier .

Merci .

Poste le Wednesday 21 January 2009 15:43:28
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: distribution

en fouillant sur le net j'ai vu des sites qui parlent de script shell ... et de fil en aiguille j'ai réussi à obtenir ce que je voulais en écrivant un . Bon c'est moche comme code , mais ça fonctionne et remplit l'objectif visé (il a traité 16871 fichiers jpg , et en a retenu 5951 ) cool smiley

# Fichier for.sh.
# Exemple d'utilisation de for.


lebon="c"

c_var="c"
c_fix="c"
t_var=0
t_fix=0
debut=0
for fichier in /home/hadron/photo_seules2/*.jpg
do

set $(du --apparent-size "$fichier")
t_var=$1
c_var=$2
c_var_tron=${c_var%_*.jpg}

if [ $c_var_tron != $c_fix ]
then
if [ $debut -ne 0 ]
then
# echo "$t_fix"
# echo "$lebon"
# echo
cp -f "$lebon" "/home/hadron/photo_seules3"
fi
c_fix=$c_var_tron
t_fix=$t_var
lebon=$c_var
else
if [ $t_var -ge $t_fix ]
then
t_fix=$t_var
lebon=$c_var
fi

fi
debut=1
done

# echo "$t_fix"
# echo "$lebon"
# echo ""
cp -f "$lebon" "/home/hadron/photo_seules3"

Poste le Saturday 24 January 2009 22:55:20
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: NBaH

Je suis perplexe face à ce script... (trop alambiqués pour être honnête)

As-tu pu vérifier sur "une représentation échantillonnaire*" ?

* en mettant quelques images de tailles différentes, portant quelques fois le même nom, dans des sous-répertoires d'un répertoire test.


Je te propose plutôt celui-ci :
- pour toute image trouvée dans les sous-répertoires
- si l'image existe dans le répertoire courant.
- et si la taille de l'image_trouvée est plus grande que celle de l'image_du_rép_courant, on écrase l'image_du_rép_courant.
- si l'image n'existe pas, on la copie dans le répertoire courant.
C'est tout.
#!/bin/bash
 
 #le chemin ET le répertoire où tu veux coller tes images
 repDest="/home/hadron/photo_seules3"
 #le chemin ET le répertoire où sont les répertoires qui contiennent tes images
 repSrc="/home/hadron/photo_seules2"
 # l'extension des fichiers cherchés
 ext=".jpg"
 
 [ ! "$PWD " = "$repDest" ] &&  cd "$repDest"
 
  for image in "$(find ~/Images -type f -name \*"$ext")"
	if [ -f "$(basename "image")" ]; then
		[ -s "$image" -gt "$(basename "image")" ] && cp "$image" "$(basename "$image")"
		else
		cp "$image" "$(basename "$image")"
	fi
done
Les "winking smiley"s sont à remplacer par une simple parenthèse fermante.

Poste le Sunday 25 January 2009 12:35:41
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: NBaH

oops ! Il faut lire
if [ -f "$(basename "$image")" ]; then
[ -s "$image" -gt "$(basename "$image")" ] && cp "$image" "$(basename "$image")"
[/code

Poste le Sunday 25 January 2009 13:07:35
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: distribution

NBaH: . (trop alambiqués pour être honnête)


Forcément je ne suis pas informaticien , j'avais juste besoin pour l'occasion de traiter un lot de fichier jpg . à l'origine j'avais 16871 dossier contenat 1 image .

j'ai fait $mcp ~/photos_initiales/*/"*-*.jpg" ~/photo_seules2/"#2_#1.jpg"

ensuite j'ai en fouillant sur le net trouvé des sites qui traitent de la manipulation des chaines de charactères etc . j'ai trouvé

[www.linux-kheops.com]

et

[www.linux-france.org]

en m'inspirant des exemples donnés sur ces sites le but était en partant de photo_seules2 contenant toutes les images de la forme .

refporduit-descriptionproduit_nomancienrepertoire.jpg

selectionner et copier dans photo_seules3 celles qui ont la plus grande taille pour un préfixe donné refproduit-descriptionproduit

donc au début j'avais dans photo_seules2

refporduit-descriptionproduit_nomancienrepertoire1.jpg 28 ko
refporduit-descriptionproduit_nomancienrepertoire2.jpg 3 ko
refporduit-descriptionproduit_nomancienrepertoire3.jpg 95 ko

etc

et à la fin j'ai eu dans photo_seules3
refporduit-descriptionproduit_nomancienrepertoire3.jpg 95 ko


je suis passé de 16871 fichiers jpg dans photo_seules2 à 5951 dans photo_seules3

car parfois pour un refporduit-descriptionproduit donné il y avait que 2 images voir une . Ce n'était pas forcément 3 images par produits .


le code est forcément moche car non écrit par un spécialiste du sujet. Mais j'ai trouvé l'excirce très intéressant . ET je vais continuer à potasser ce sujet sur les sites que j'ai trouvé . J'ai trouvé un livre mais j'hésite ...[www.editions-eyrolles.com]


est ce que ça vaut le coup par rapport à ce qui existe sur le net . J'ai regardé le chapitre 2 disponible . Ce fut dur dur .

Poste le Sunday 25 January 2009 13:32:16
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: distribution

c'est d'autant plus intéressant qu'il n'y a pas que sur ce problème que je vais avoir besoin de souplesse dans l'utilisation de ces outils . par exemple si je veux redimensionner un lot d'images , j'ai trouvé batch processor pour gimp . Mais si je veux fusionner par lot deux images , il n'y a pas ( enfin disons que je n'ai pas trouvé ) . Si j'arrive à trouver la bonne commande gimp -options fusion image1 image2 , il me suffira de mettre cette ligne dans une boucle for dans un script et hop problème résolu. spinning smiley sticking its tongue out

pour le script que j'ai donné au dessus comme je suis passé par plusieurs tests , c'est le script cinq.sh , j'ai bidouillé jusqu'au script huit.sh car j'avais après des modifications a effectué sur la chaine de charactère des noms de fichiers .Je précise la syntaxe des 5951 fichiers à l'origine pouvaient légérement être différente , d'où la difficulté pour repérer les motifs ,
par exemple des fois il n'y avait pas le refproduit, juste descriptionproduit.jpg des fois au lieu d'avoir refproduit tout collé (pratique pour la gestion des motifs) , j'avais c1-a-b-description produit puis c1-c-d-description produit ...bref un beau capharnaum que je n'aurais pas pu traiter avec une interface graphique avec des options limitées

Poste le Sunday 25 January 2009 14:07:52
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: distribution

NBaH : [ -s "$image" -gt "$(basename "image"winking smiley" ] (1)


je suppose que cette (1) compare la taille des deux fichiers ? Je précise j'ai du tout apprendre en quelque jours , et en fonction de la découverte de tel ou tel outil, je me demandais comment l'utiliser pour atteindre l'objectif . pour comparer la taille j 'ai utiliser la commande "du" (et ça fonctionne ) .


là je viens d'essayer en testant cette ligne (1) sur deux fichiers a.jpg 586 ko et b.jpg 10 ko

avec le script suivant

#!/bin/bash

image1="/home/hadron/a.jpg"
image2="/home/hadron/b.jpg"

if [ -s "$image1" -gt "$image2" ]
then
echo " a.jpg plus grand "
else
echo "b.jpg plus grand "
fi



et j'obtiens :

[hadron@localhost ~]$ ./dix.sh
./dix.sh: line 6: [: too many arguments
b.jpg plus grand

si j'enleve le -s et remplace le -gt par -ge car d'après [www.linux-france.org] c'est -ge pour comparer ">"

j'obtiens

[hadron@localhost ~]$ ./dix.sh
./dix.sh: line 6: [: /home/hadron/a.jpg: integer expression expected
b.jpg plus grand

Poste le Sunday 25 January 2009 14:45:35
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: NBaH

J'avais compris qu'il s'agissait d'un script que tu avais récupéré sur internet.
Je voulais te mettre en garde...

Pour le redimensionnement par lot d'image, renseigne toi sur imagemagick.

Voici quelques liens qui te seront utiles pour la suite de ton apprentissage :

GNU Bourne Again SHell

Tutoriels :
sur Lea
Guide Bash du débutant
LE guide avancé d'écriture des scripts Bash

Poste le Sunday 25 January 2009 15:00:09
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: NBaH

Ah oui, je me suis planté !
l'option de test -s vérifie si la taille d'un fichier est plus grande que zéro.
[ $(stat -c%s "$image") -gt $(stat -c%s "$(basename "$image")") ] && cp "$image" "$(basename "$image")"
Voilà qui devrait corriger mon erreur.

Poste le Sunday 25 January 2009 15:14:38
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: NBaH

pour les comparaisons, cf. man [

Poste le Sunday 25 January 2009 15:28:47
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: distribution

NBah : "J'avais compris qu'il s'agissait d'un script que tu avais récupéré sur internet.Je voulais te mettre en garde..."


Je n'ai pas compris ?


NBaH :"[ $(stat -c%s "$image"winking smiley -gt $(stat -c%s "$(basename "$image"winking smiley"winking smiley ] && cp "$image" "$(basename "$image"winking smiley"

cette ligne fonctionne merci smiling smiley .En faisant un man stat j'ai trouvé pour c%s
%s Block size (for faster transfers) , donc renvoie la taille du fichier et -gt = strictement supérieur

ta solution est nettement plus concise et propre que ma bidouille smiling bouncing smiley



Merci pour les liens je vais voir smileys with beer

Poste le Sunday 25 January 2009 15:33:34
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: distribution

NBaH a écrit:
-------------------------------------------------------

> Pour le redimensionnement par lot d'image,
> renseigne toi sur imagemagick.
>



j'avais plus de 5000 images à traiter ,Merci pour imagemagick qui m'a permis de faire ça automatiquement .

deux scripts que j'ai utilisé , le premier met un logo en grand dans les images et redimensionne

Citation
premier script

#!/bin/bash
WATERMARK="/home/hadron/water/watermark/calque4.png"
WATERMARK2="/home/hadron/water/watermark/calque_resize.png"


somme=0
compteur=0

for each in /home/hadron/water/original/*.jpg
do

somme=$((somme+1))
if [ "$somme" -ge "$compteur" ]
then
compteur=$((compteur+10))
echo "$somme"
fi
nom=${each##/*/}
nom2=${nom%.jpg}
set $(identify -format "%w %h" $each) #renvoie la taille de l'image original
largeur=$1 # prend la largeur de l'image original
hauteur=$2 #prend la hauteur de l'image original
convert -resize "$largeur"x"$hauteur"! $WATERMARK $WATERMARK2 2> /dev/null # redimensionne le logo à la taille de l'image
endroit="/home/hadron/water/marque/"$nom
endroit2="/home/hadron/water/marque_300/"$nom
composite -dissolve 10 -gravity center $WATERMARK2 $each $endroit 2> /dev/null #compose le logo et l'image
convert -resize 300 $endroit $endroit2 2> /dev/null

done

exit 0





le second met 16 fois le logo en petit dans l'image et redimensionne

Citation
seconde script

#!/bin/bash
WATERMARK="/home/hadron/water/watermark/calque5.png"
WATERMARK2="/home/hadron/water/watermark/calque_resize.png"
MOTIF="/home/hadron/water/watermark/motif.png"
MOTIF2="/home/hadron/water/watermark/motif2.png"

somme=0
compteur=0


for each in /home/hadron/water/original/*.jpg

do

somme=$((somme+1))
if [ "$somme" -ge "$compteur" ]
then
compteur=$((compteur+10))
echo "$somme"
fi

nom=${each##/*/}
nom2=${nom%.jpg}
set $(identify -format "%w %h" $each)
largeur=$1
hauteur=$2
largeur_motif=$((largeur/2))
hauteur_motif=$((hauteur/4))
largeur_motif2=$((largeur_motif/2))
hauteur_motif2=$((hauteur_motif/2))
largeur_texte=$((largeur_motif2*8/10 ))
convert -size "$largeur_motif"x"$hauteur_motif" xc:transparent $MOTIF 2> /dev/null
convert -size "$largeur_motif2"x"$hauteur_motif2" xc:transparent $MOTIF2 2> /dev/null
convert -resize "$largeur_texte" $WATERMARK $WATERMARK2 2> /dev/null
composite -gravity center $WATERMARK2 $MOTIF2 $MOTIF2 2> /dev/null
composite -gravity southwest $MOTIF2 $MOTIF $MOTIF 2> /dev/null
composite -gravity northeast $MOTIF2 $MOTIF $MOTIF 2> /dev/null
endroit="/home/hadron/water/marque2/"$nom
endroit2="/home/hadron/water/marque2_300/"$nom
composite -dissolve 15 -tile $MOTIF $each $endroit 2> /dev/null
convert -resize 300 $endroit $endroit2 2> /dev/null

done

exit 0



sur le seconde script même si il fonctionne , à chaque image traitée j'ai ce message en console

./watermark.sh: line 11: 10215 Abandon composite -dissolve 15 -tile $MOTIF $each $endroit 2> /dev/null

j'ai ce message à cause de l'option -tile . Si je l'enleve il n'y a plus ce message . Je ne sais pas à quoi ce message correspond mais il n'empeche pas l'opération de se réaliser correctement .

Poste le Monday 2 February 2009 12:59:18
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: NBaH

et en incluant $nom dans les guillemets :
endroit="/home/hadron/water/marque2/$nom"
endroit2="/home/hadron/water/marque2_300/$nom"

...
?

Poste le Monday 2 February 2009 13:37:52
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: distribution

endroit="/home/hadron/water/marque2/$nom"
et
endroit="/home/hadron/water/marque2/"$nom

représente la même chaîne , il n'y a pas de changement dans le résultat ,ça fonctionne très bien

Poste le Monday 2 February 2009 13:57:23
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: NBaH

Apparemment !

Essaye ça :
touch "azaz zaza"
nom_fic="azaz zaza"
ls $nom
ls "$nom"

Poste le Monday 2 February 2009 14:39:25
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: distribution

je ne comprends pas ?

Poste le Monday 2 February 2009 15:21:55
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: NBaH

Oui, si c'était un problème d'espace dans le nom d'un fichier, le message serait différent. De plus, tu précises bien que ça le fait pour chaque image.

Je ne sais pas.

Essaie
sh -x watermark.sh
cela localisera mieux le souci, parceque selon la copie de ton script, la ligne 11 c'est le début de la boucle
...
?

Poste le Monday 2 February 2009 16:39:00
Répondre     Citer    
Re: copier des fichiers en les renommant
Envoyé par: distribution

NBaH a écrit:
-------------------------------------------------------

> Essaiesh -x watermark.sh cela localisera mieux le
> souci, parceque selon la copie de ton script, la
> ligne 11 c'est le début de la boucle
> ...
> ?

si j'écris seulement la ligne à l'origine du message "composite -tile " j'ai quand même le message "abandon " ( certes succin car il y a seulement ce mot quand je n'utilise pas de boucle ) . C'est lié à l'option -tile , car si j'utilise cette commande sans cette option je n'ai pas ce message " abandon " .
je dois lire la doc d'imagemagick je finirai bien par trouver l'explication au détour d'un paragraphe et surtout à quoi correspond cet abandon vu que la commande remplit son objectif avant d'afficher ce message !

Poste le Monday 2 February 2009 17:48:18
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
copier des fichiers en les renommant
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons