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 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' wink

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,

pingouinux a écrit :

[...]

	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 wink

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