#1 Le 29/12/2012, à 01:00
- coolben
[Script]Comment comparer le debut d'une chaine ?
Bonjour
Je cherche a faire un script de renommage de fichier image.
Dans ce script, j'aimerai comparer deux chaine (le nom de mon fichier et le préfixe que je veux lui donner)
Voici mon script :
#!/bin/sh
for fichier in *.jpg;
do
echo "traitement de $fichier"
INFO=$(identify -format "%[EXIF:Datetime]" "$fichier" )
#echo $INFO
DATEPHOTO=`echo $INFO | cut -f1 -d' '`
#echo $DATEPHOTO
TIMEPHOTO=`echo $INFO | cut -f2 -d' '`
#echo $TIMEPHOTO
HEURE=`echo $TIMEPHOTO | cut -f1 -d:`
MINUTE=`echo $TIMEPHOTO | cut -f2 -d:`
SECONDE=`echo $TIMEPHOTO | cut -f3 -d:`
if [ $HEURE -gt 6 ]
then
PREFIX=$HEURE"h"$MINUTE"m"$SECONDE
else
HEURE=$(($HEURE+24))
PREFIX=$HEURE"h"$MINUTE"m"$SECONDE
fi
echo "$PREFIX pour : $fichier"
if [ $fichier == "$PREFIX*" ]
then
echo "OK"
else
echo "Le nom de fichier doit changer"
fi
done
voici le résultat:
coolben@touchsmart-310-1210fr:~/projets/script/time image$ ./batch.sh
traitement de DSC_0002.jpg
20h25m19 pour : DSC_0002.jpg
./batch.sh: 27: [: DSC_0002.jpg: unexpected operator
Le nom de fichier doit changer
traitement de DSC_0120 2.jpg
^[[A24h19m33 pour : DSC_0120 2.jpg
./batch.sh: 27: [: DSC_0120: unexpected operator
Le nom de fichier doit changer
coolben@touchsmart-310-1210fr:~/projets/script/time image$ ls *.jpg
DSC_0002.jpg DSC_0120 2.jpg
coolben@touchsmart-310-1210fr:~/projets/script/time image$
Quel est l'erreur de ma ligne 27 ?
voici la ligne 27 :
if [ $fichier == "$PREFIX*" ]
http://www.starbusiness.fr : jeux en ligne bientôt Massivement Multi Joueur. Gestion et Wargame dans un univers à la conquête de l'espace ...
Hors ligne
#2 Le 29/12/2012, à 01:29
- Watael
Re : [Script]Comment comparer le debut d'une chaine ?
toutes les variables doivent être développées entre guillemets.
si des caractères peuvent interférer dans l'interprétation des variables, place-les entre accolades : "${var}autrechose"
ce qui permet de la distinguer d'une éventuelle autre variable "$varautrechose".
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 29/12/2012, à 08:32
- pingouinux
Re : [Script]Comment comparer le debut d'une chaine ?
Bonjour,
En plus de ce que t'indique Watael, je te conseille d'utiliser bash (#!/bin/bash en 1ère ligne), et de remplacer cette ligne
if [ $fichier == "$PREFIX*" ]
par celle-ci
if [ "${fichier::8}" == "$PREFIX" ]
ou même mieux, par celle-là
if grep -q "^$PREFIX" <<<"$fichier"
Tu peux aussi simplifier cette séquence :
if [ $HEURE -gt 6 ]
then
PREFIX=$HEURE"h"$MINUTE"m"$SECONDE
else
HEURE=$(($HEURE+24))
PREFIX=$HEURE"h"$MINUTE"m"$SECONDE
fi
en la remplaçant par
((HEURE>6)) || ((HEURE+=24))
PREFIX=$HEURE"h"$MINUTE"m"$SECONDE
Hors ligne
#4 Le 29/12/2012, à 22:56
- coolben
Re : [Script]Comment comparer le debut d'une chaine ?
Merci !!
Voici mon script qui fonctionne bien maintenant :
#!/bin/bash
for fichier in *.jpg;
do
echo "traitement de $fichier"
INFO=$(identify -format "%[EXIF:Datetime]" "$fichier" )
#echo $INFO
DATEPHOTO=`echo $INFO | cut -f1 -d' '`
# echo $DATEPHOTO
TIMEPHOTO=`echo $INFO | cut -f2 -d' '`
# echo $TIMEPHOTO
HEURE=`echo $TIMEPHOTO | cut -f1 -d:`
MINUTE=`echo $TIMEPHOTO | cut -f2 -d:`
SECONDE=`echo $TIMEPHOTO | cut -f3 -d:`
((HEURE>6)) || ((HEURE+=24))
PREFIX=$HEURE"h"$MINUTE"m"$SECONDE
# echo "$PREFIX pour : $fichier"
if [ ${fichier::8} == "$PREFIX" ]
then
echo "OK"
else
echo "Le nom de fichier doit changer"
mv "$fichier" "$PREFIX$fichier"
fi
done
http://www.starbusiness.fr : jeux en ligne bientôt Massivement Multi Joueur. Gestion et Wargame dans un univers à la conquête de l'espace ...
Hors ligne
#5 Le 30/12/2012, à 00:21
- Watael
Re : [Script]Comment comparer le debut d'une chaine ?
apparemment, tu ne te sers pas de la date, que de l'heure, alors
#!/bin/bash
for f in *.jpg
do
oIFS="$IFS"
IFS=' :'
ar=( $(identify -format '%[EXIF:DateTime]' "$f") )
IFS="$oIFS"
h=ar[3]
(( h = h>6 ? h : h+24 ))
prFx="${h}h${ar[4}m${ar[5]}"
test "${f::8}" = "$prFx" && echo "OK" || mv "$f" "$prFx$f"
done
ça devrait accélérer un peu le script de ne pas passer par tous ces `cut'
Dernière modification par Watael (Le 30/12/2012, à 02:22)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 04/01/2013, à 15:57
- Totor
Re : [Script]Comment comparer le debut d'une chaine ?
Salut,
[...]
if [ $fichier == "$PREFIX*" ]
par celle-ci
if [ "${fichier::8}" == "$PREFIX" ]
ou même mieux, par celle-là
if grep -q "^$PREFIX" <<<"$fichier"
[...]
Mouais, j'aurai plutôt fait comme ceci :
if [[ "${fichier}" == "${PREFIX}"* ]]
Ainsi, cela évite :
- d'utiliser les regex et un process supplémentaire
- d'oublier de changer la valeur 8 si la longueur du préfixe venait à changer.
mais bon, ce n'est que chipoter
Dernière modification par Totor (Le 04/01/2013, à 15:58)
-- Lucid Lynx --
Hors ligne
#7 Le 04/01/2013, à 17:27
- pingouinux
Re : [Script]Comment comparer le debut d'une chaine ?
@Totor #6 : Effectivement. Je n'ai pas l'habitude de cette syntaxe…
Hors ligne