#1 Le 14/11/2009, à 12:01
- damo42
[Résolu] Convertir dans plusieurs sous-répertoires des png en jpg
Bonjour
Je suis en train de créer un script qui me permet de convertir plusieurs images dans plusieurs sous-répertoires
$ cd /home/damien/test/
Dans ce répertoire il y a 3 sous-répertoires appelés 1,2 et 3.
Voici le script que je nomme png2jpgtest
#!/bin/bash
COMMAND="convert -quality 80 test.png test.jpg"
# Si on a moins d'un argument, on quitte
[ $# -ne 1 ] && echo 'J'\''ai besoin d'\''un argument !' && exit 1
# Si le répertoire source n'existe pas, on quitte
[ ! -d "$1" ] && echo 'J'\''ai besoin d'\''un répertoire de source valide !' && exit 1
SOURCE="$1"
find "$SOURCE" -iname '*.png' -exec $COMMAND {} \;
J'éxécute le script avec la commande
$ sh png2jpgtest /home/damien/test
Et voici ce que j'obtiens
convert: impossible d'ouvrir l'image `test.png': Aucun fichier ou dossier de ce type @ blob.c/OpenBlob/2480.
convert: impossible d'ouvrir le fichier `test.png' @ png.c/ReadPNGImage/2888.
convert: impossible d'ouvrir l'image `test.jpg': Aucun fichier ou dossier de ce type @ blob.c/OpenBlob/2480.
convert: nom de fichier d'image absent `/home/damien/test/1/test.png' @ convert.c/ConvertImageCommand/2806.
convert: impossible d'ouvrir l'image `test.png': Aucun fichier ou dossier de ce type @ blob.c/OpenBlob/2480.
convert: impossible d'ouvrir le fichier `test.png' @ png.c/ReadPNGImage/2888.
convert: impossible d'ouvrir l'image `test.jpg': Aucun fichier ou dossier de ce type @ blob.c/OpenBlob/2480.
convert: nom de fichier d'image absent `/home/damien/test/2/test.png' @ convert.c/ConvertImageCommand/2806.
convert: impossible d'ouvrir l'image `test.png': Aucun fichier ou dossier de ce type @ blob.c/OpenBlob/2480.
convert: impossible d'ouvrir le fichier `test.png' @ png.c/ReadPNGImage/2888.
convert: impossible d'ouvrir l'image `test.jpg': Aucun fichier ou dossier de ce type @ blob.c/OpenBlob/2480.
convert: nom de fichier d'image absent `/home/damien/test/3/test.png' @ convert.c/ConvertImageCommand/2806.
J'ai vérifié si le fichier test.png éxiste bien dans le répertoire 2 par exemple
~/test/2$ ls
test.png
Je ne vois pas d'où viens mon erreur.
Besoin d'aide SVP
Merci
damien
Dernière modification par damo42 (Le 17/11/2009, à 12:35)
Hors ligne
#2 Le 14/11/2009, à 21:55
- Ferod
Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg
Bonjour
Je n'ai pas forcement de solution à ton problème mais il y a 2 trucs qui vont pas :
1 - Dans COMMANDE si tu fais un "man convert" tu verras que pour convertir une image, la commande à taper est :
convert input-file [options] output-file
donc il faudrait mettre plutot :
COMMAND="convert test.png -quality 80 test.jpg"
Donc cette commande elle marche. Si tu as un fichier test.png tu verra que ta commande va te générer un test.jpg comme tu le souhaites.
2 - avec le find tu ne peux pas utiliser la commande -exec comme tu le fais ici. Tout ce qu'il y a avant le -exec est bon. D'ailleurs si tu t'arrêtes là tu as surement du constater qu'il te liste correctement tous les fichier png.
Ce qu'il faudrait faire c'est :
find "$SOURCE" -iname '*.png' -exec convert {} -quality 80 fichierDeSortie.jpg \;
Et c'est là que je ne sais pas trop. Parce que j'imagine que tu voudrais que le fichier de sortie soit du même nom que le fichier d'entrée (juste l'extension qui change). A ta disposition tu as le nom du fichier et l'adresse complète dans la variable {} mais il faudrait remplacer png par jpg.
J'ai fais quelques essais mais rien de concluant.
Pour info j'utilise une commande pour convertir des mp3 en ogg et là tu devrais voir comment changer l'extension avec la commande sed.
mkdir ogg
for i in *.mp3
do
new_name=`echo "$i" | sed s/.mp3/.ogg/g`
mpg123 -b 10000 -s "$i" | sox -t raw -r 44100 -s -w -c2 - ogg/temp.wav
oggenc ogg/temp.wav -o ogg/"$new_name"
done
rm -f ogg/temp.wav
Bon courage !
"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich
Hors ligne
#3 Le 15/11/2009, à 01:44
- Mpok
Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg
Agreed with Ferod for 1. and 2. (test not done)
Hors ligne
#4 Le 15/11/2009, à 12:25
- damo42
Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg
Merci Ferod & Mpok
@ Ferod
Donc je l'ai corrigé comme ceci
#!/bin/bash
COMMAND="convert test.png -quality 80 test.jpg"
# Si on a moins d'un argument, on quitte
[ $# -ne 1 ] && echo 'J'\''ai besoin d'\''un argument !' && exit 1
# Si le répertoire source n'existe pas, on quitte
[ ! -d "$1" ] && echo 'J'\''ai besoin d'\''un répertoire de source valide !' && exit 1
SOURCE="$1"find "$SOURCE" -iname 'test.png' -exec convert -quality 80 test.jpg \;
COMMAND ne fonctionne plus pour l'instant mais c'est pas grave.
Et voici le résultat
convert: nom de fichier d'image absent `test.jpg' @ convert.c/ConvertImageCommand/2806.
convert: nom de fichier d'image absent `test.jpg' @ convert.c/ConvertImageCommand/2806.
convert: nom de fichier d'image absent `test.jpg' @ convert.c/ConvertImageCommand/2806.
Est-ce que la commande sed peux servir à convertir des images ?
Peux-tu m'expliquer cette ligne sur ton script de convertion de fichier mp3 en ogg.
new_name=`echo "$i" | sed s/.mp3/.ogg/g`
+
damien
Dernière modification par damo42 (Le 15/11/2009, à 12:32)
Hors ligne
#5 Le 15/11/2009, à 16:59
- Ferod
Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg
Re
Hier j'ai regardé encore un petit peu la commande mais c'est pas simple.
find "$SOURCE" -iname 'test.png' -exec convert -quality 80 test.jpg \;
J'imagine que tu comprends le message d'erreur : tout est bon jusqu'à convert. Le problème c'est que tu ne spécifies pas de fichier d'entré à la commande convert, donc il te dit qu'il n'a pas de fichier image. Pour cela il faut que tu rajoutes le paramètre {} qui contient l'adresse du fichier. Si tu veux savoir ce que contient {}, tu peux executer le début de la commande :
find /home/tonLogin/test/ -iname '*.png'
D'ailleurs si au lieux de convertir les png t'aurais voulu les compresser, la commande serait :
find /home/tonLogin/test/ -iname '*.png' -exec gzip {} \;
Je te dis tout ça pour que tu comprennes bien ce qu'il y a dans {} parce que c'est un peu abstrait...
Pour la commande convert il nous faut le paramètre d'entrée (l'adresse de l'image à convertir) /home/tonLogin/test/2/test.png : ça c'est bon on l'a dans {} mais il nous faut aussi le paramètre de sortie c'est à dire l'image au format jpg : /home/tonLogin/test/test.jpg. Donc j'ai essayé quelque chose de radical :
find /home/tonLogin/test/ -iname '*.png' -exec convert {} -quality {}.jpg
Ça ne renvoi pas d'érreur, je problème c'est que le nom n'est pas beau puisque c'est test.png.jpg.
Et c'est là que la commande sed va pouvoir te servir. En fait depuis le début on a, dans le {}, l'adresse du fichier png et on cherche l'adresse du fichier jpg. Or c'est très simple, il suffit de remplacer, dans la chaine de caractère {} png par jpg. Et c'est à ça que sert la commande sed : dans un flux de chaine caractères il te permet (entre autre) de remplacer une chaine de caractère par une autre.
Dans le script que je t'ai donné, i contient le nom d'un fichier mp3 (for i in *.mp3). Ensuite le echo $i veut dire d'afficher la valeur de $i. Cette commande est envoyé directement par le pipe | dans la commande sed qui permet de substituer le mp3 en ogg (c'est la signification du s dans "s/.mp3/.ogg/g"). Le "g" à la fin veut dire qu'il faut le faire à chaque fois qu'on rencontre la chaine .mp3. Et cette nouvelle variable est affecté à new_name via les ``.
Voici en "décomposé" ce que ça donne :
$ echo toto.mp3
toto.mp3
$ echo toto.mp3 | sed s/.mp3/.ogg/g
toto.ogg
Au lieu de me renvoyer la chaine toto.mp3, il a fait la substitution.
Je pense qu'il faudrait que tu partes sur quelque chose de similaire à ce qu'il y a dans le script, c'est à dire une boucle for. Ça te permettra de faire des choses plus sophistiquées et plus compréhensible. Donc il faudrait que tu partes sur :
for i in find "$SOURCE" -iname '*.png'
do
etc...
done
Bon courage !
"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich
Hors ligne
#6 Le 16/11/2009, à 19:57
- damo42
Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg
Merci ferod pour ton aide précieuse
Voici comment j'ai écrit le script
#!/bin/bash
# Si on a moins d'un argument, on quitte
[ $# -ne 1 ] && echo 'J'\''ai besoin d'\''un argument !' && exit 1
# Si le répertoire source n'existe pas, on quitte
[ ! -d "$1" ] && echo 'J'\''ai besoin d'\''un répertoire de source valide !' && exit 1
SOURCE="$1"find "$SOURCE" -iname 'test.png' -exec convert {} -quality 85 {}.jpg \;
find "$SOURCE" -iname 'test.png.jpg' -exec rename 's/png.jpg/jpg/' test.jpg {} \;
find "$SOURCE" -iname 'test.png' -exec rm -f test.png {} \;
Je supprime les fichier en png à la fin !
Hors ligne
#7 Le 16/11/2009, à 23:10
- Ferod
Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg
De rien je progresse moi aussi !
Par contre je pense qu'il faut remplacer les test.png par *.png. Si tu veux remplacer tous les fichiers .png.
Edit :
Je suis reparti sur mon idée de boucle for. Voici sur quoi je suis arrivé :
#!/bin/bash
# Si on a moins d'un argument, on quitte
[ $# -ne 1 ] && echo 'J'\''ai besoin d'\''un argument !' && exit 1
# Si le répertoire source n'existe pas, on quitte
[ ! -d "$1" ] && echo 'J'\''ai besoin d'\''un répertoire de source valide !' && exit 1
SOURCE="$1"
for i in `find $SOURCE -name "*.png"`
do
new_name=`echo "$i" | sed s/.png/.jpg/g`
convert $i -quality 80 $new_name
rm $i
done
Ce script marche tout le temps sauf quand le fichier png contient des espaces. Je ne comprends pas pourquoi...
La suite dans un prochain épisode ! J'ai les yeux qui se ferment...
Dernière modification par Ferod (Le 16/11/2009, à 23:24)
"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich
Hors ligne
#8 Le 16/11/2009, à 23:24
- AnsuzPeorth
Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg
Euh...hizoka, avec le find de la redirection, tu risque pas d'avoir des fichiers avec extension en majuscule...tu aurais du utiliser -iname pour cela !
edit:pourquoi as tu effacé ton message hizoka ?
edit2:tient, il est après maintenant
Dernière modification par AnsuzPeorth (Le 16/11/2009, à 23:26)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#9 Le 16/11/2009, à 23:24
- Hizoka
Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg
Voila mon code
# Liste des fichiers png et les traite
while read fichier
do
if [[ -z ${fichier} ]]
then
echo -e "${FUSHIA}Il n'a pas de fichier png.${NOIR}"
exit
fi
# Vérifie si l'extension est en miniscule
if [[ ${fichier##*.} == [Pp][Nn][Gg] && ${fichier##*.} != png ]]
then
# Si l'extension est en majuscule
mv "${fichier}" "${fichier/%[Pp][Nn][Gg]/png}"
fi
# Conversion des images
convert -quality 70 "${fichier}" "${fichier/%png/jpg}"
fichier=${fichier##*/}
echo -e "Conversion de ${BLEUFONCE}${fichier}${NOIR} en ${FUSHIA}${fichier/%png/jpg}${NOIR}."
done < <(find "${PWD}" -iname "*.png")
edit 1 : oups en effet
edit 2 : j'avais fait une connerie dedans et je pensais pas quelqu'un l'aurait deja lu
Dernière modification par Hizoka (Le 16/11/2009, à 23:27)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#10 Le 16/11/2009, à 23:28
- AnsuzPeorth
Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg
edit 1 : oups en effet
edit 2 : j'avais fait une connerie dedans et je pensais pas quelqu'un l'aurait deja lu
et si, pas de bol..je passais par là par hasard
sinon, je trouve que tu te prends la tête pour pas grand chose, je suis sur qu'il y a moyen de faire différent, mais c'est pas le but du topic
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#11 Le 16/11/2009, à 23:42
- Hizoka
Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg
Mince
bah je pourrais virer la vérification d'extension en fait...
# Couleurs pour echo
FUSHIA="\033[1;35m"
NOIR="\033[1;0m"
BLEUFONCE="\033[1;34m"
VERT="\033[1;32m"
# Liste des fichiers png et les traite
while read fichier
do
if [[ -z ${fichier} ]]
then
echo -e "${FUSHIA}Il n'a pas de fichier png.${NOIR}"
exit
fi
# Conversion des images
convert -quality 70 "${fichier}" "${fichier/%[Pp][Nn][Gg]/jpg}"
echo -e "Conversion de ${BLEUFONCE}${fichier##*/}${NOIR} en ${FUSHIA}${fichier/%png/jpg}${NOIR}."
done < <(find "${PWD}" -iname "*.png")
tu penses qu'il y a moyen de faire plus simple ?
ça m'interresse alors
si on peut s'ameliorer, c'est toujours bon à prendre.
PS : ce code fait partie d'un ensemble plus complexe de commandes
Dernière modification par Hizoka (Le 16/11/2009, à 23:45)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#12 Le 21/11/2009, à 14:29
- damo42
Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg
Salut ferod
Par contre je pense qu'il faut remplacer les test.png par *.png. Si tu veux remplacer tous les fichiers .png.
Je l'ai fait exprès férod je voulais seulement convertir que les fichiers png ayant le même nom.
Je viens d'ajouter le script au wiki debian-facile.org
http://debian-facile.org/wiki/bash:png2jpg
Merci
Hors ligne