Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails) *** mise à jour 12/10/2014 ***

#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".


eval, c'est mal.

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

En 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)


eval, c'est mal.

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…

En ligne

Haut de page ↑