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 24/01/2015, à 17:09

Levi59

[Résolu] Besoin d'aide script sh (DSM)

Bonjour,
J'aurais besoin des lumières d'un spécialiste de sh pour ce petit script.
Pour faire simple, je le lance depuis DSM sur mon NAS pour lister les artworks manquant dans les différents dossiers. Je le lance depuis le dossier avec mes médias avec :

sh monscript.sh

Mon problème est tout con mais je ne le comprend pas. J'ai noté un "echo" dans le script qui, lorsque je le commente, fait planter le script.
Le résultat doit être de ce type :

/volume1/Multimedia/Animation/A Wind Named Amnesia (1990)/A Wind Named Amnesia (1990)-clearart.png
/volume1/Multimedia/Animation/Asterix -- Collection --/Asterix Et Cleopatre (1968)/Asterix Et Cleopatre (1968)-clearart.png
/volume1/Multimedia/Animation/Asterix -- Collection --/Asterix Et les Vikings (2006)/Asterix Et les Vikings (2006)-clearart.png
/volume1/Multimedia/Animation/Asterix -- Collection --/Asterix le Gaulois (1967)/Asterix le Gaulois (1967)-clearart.png
/volume1/Multimedia/Animation/Asterix -- Collection --/Les 12 Travaux D'asterix (1976)/Les 12 Travaux D'asterix (1976)-clearart.png
/volume1/Multimedia/Animation/Asura (2012)/Asura (2012)-clearlogo.png

Mais sans ce petit echo, j'ai ça :

/volume1/Multimedia/Animation/A Wind Named Amnesia (1990)/A Wind Named Amnesia (1990)-clearart.png
/volume1/Multimedia/Animation/Aladdin -- Collection --/Aladdin -- Collection ---clearlogo.png
/volume1/Multimedia/Animation/Aladdin -- Collection --/Aladdin -- Collection ---poster.jpg
/volume1/Multimedia/Animation/Aladdin -- Collection --/Aladdin -- Collection ---fanart.jpg
/volume1/Multimedia/Animation/Aladdin -- Collection --/Aladdin -- Collection ---clearart.png
/volume1/Multimedia/Animation/Aladdin -- Collection --/Aladdin -- Collection ---discart.png
/volume1/Multimedia/Animation/Asterix -- Collection --/Asterix Et Cleopatre (1968)/Asterix Et Cleopatre (1968)-clearart.png
/volume1/Multimedia/Animation/Asterix -- Collection --/Asterix Et les Vikings (2006)/Asterix Et les Vikings (2006)-clearart.png
/volume1/Multimedia/Animation/Asterix -- Collection --/Asterix le Gaulois (1967)/Asterix le Gaulois (1967)-clearart.png
/volume1/Multimedia/Animation/Asterix -- Collection --/Les 12 Travaux D'asterix (1976)/Les 12 Travaux D'asterix (1976)-clearart.png
/volume1/Multimedia/Animation/Asterix -- Collection --/Asterix -- Collection ---clearlogo.png
/volume1/Multimedia/Animation/Asterix -- Collection --/Asterix -- Collection ---poster.jpg
/volume1/Multimedia/Animation/Asterix -- Collection --/Asterix -- Collection ---fanart.jpg
/volume1/Multimedia/Animation/Asterix -- Collection --/Asterix -- Collection ---clearart.png
/volume1/Multimedia/Animation/Asterix -- Collection --/Asterix -- Collection ---discart.png
/volume1/Multimedia/Animation/Asura (2012)/Asura (2012)-clearlogo.png

Clairement un problème, que ce soit dans le nombre de résultat ou dans les noms de fichiers.

Voici le script en question. Merci d'avance de votre aide.

#!/bin/sh
# chmod ./recursive-artwork-finder.sh
# Usage : ./recursive-artwork-finder.sh
# ex : ./recursive-artwork-finder.sh

ListeArtwork="/volume1/Autres/liste_artwork.txt"
> "$ListeArtwork"

__artwork ()
{
	[ $1 -eq 1 ] && {
		#test artworks
		for aw in logo.png poster.jpg fanart.jpg extrafanart1.jpg
		do
			[ -f "$3/$2/$aw" ] || {
				echo "$3/$2/$aw" >> "$ListeArtwork"
				#echo "$aw absent"
			}
		done
	} || {
		#test artworks film
		for aw in clearlogo.png poster.jpg fanart.jpg clearart.png discart.png
		do
			[ -f "$3/$2/$2-$aw" ] || {
				echo "$3/$2/$2-$aw" >> "$ListeArtwork"
				#echo "$2-$aw absent"
			}
		done
	}
}

__rec ()

{
	for i in *
	do
	[ -d "$i" ] && {
		#est un dossier
		[ "${i/-- Collection --/}" != "$i" -o "${i% (*}" != "$i" ] && {
			[ "${i/-- Collection --/}" != "$i" ] && {
				#est une collection
				__artwork 1 "$i" "$PWD"
				(cd "$i" && __rec)
				#echo "$PWD/$i"            #<<<<============= ICI
			} || {
				#est un Film
				__artwork 0 "$i" "$PWD"
				#echo "$PWD/$i"
			}
		} 
	} 
	done
}

for dir in Animation Documentaires Films
do 
	(cd "$dir" && __rec;)
done

Dernière modification par Levi59 (Le 27/01/2015, à 11:31)

Hors ligne

#2 Le 24/01/2015, à 17:40

Watael

Re : [Résolu] Besoin d'aide script sh (DSM)

salut,

dans le cas de tests "complexes" (impliquant des commandes pouvant retourner «faux») il est préférable d'utiliser la construction «if...; then ...; else ...(; elif ...); fi».

aussi, le changement de répertoire («cd» + l'emploi de sous-interpréteur que cela implique), n'est pas recommandé.

Dernière modification par Watael (Le 24/01/2015, à 17:46)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 24/01/2015, à 18:01

Levi59

Re : [Résolu] Besoin d'aide script sh (DSM)

Pour les tests, c'est ça qui fait planter lorsque je supprime le echo? Parce que c'est le point qui me chiffone. Normalement la commande echo n'était là que pour me permettre de visualiser le fonctionnement du script et ne devrait avoir aucune incidence sur les variables ou le fonctionnement...

Par contre le changement de répertoire n'est pas problématique dans le sens ou au maximum, le programme ne descend que dans 3 dossiers (genre/Collection/Film) et il n'y a donc que 3 instances de l’interpréteur au maximum et à un même moment.

Hors ligne

#4 Le 24/01/2015, à 19:30

Watael

Re : [Résolu] Besoin d'aide script sh (DSM)

c'est une question de bonnes habitudes à prendre;
comme de poster sur le forum ad'hoc.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 24/01/2015, à 21:57

Watael

Re : [Résolu] Besoin d'aide script sh (DSM)

ad hoc : D'une manière qui convient, positif : Argument ad hoc. (cf. Larousse)

forum ad hoc : Terminal, scripts et ligne de commande


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 25/01/2015, à 12:38

Levi59

Re : [Résolu] Besoin d'aide script sh (DSM)

Oups effectivement. Je suis passé un peu trop vite sur les sous-forums. Je vais poster la-bas. Merci.


Modération : il était inutile de re-poster dans la bonne section, tu pouvais demander à faire déplacer la discussion dans le bon forum.

D'autre part, merci à l'avenir d'utiliser les balises code (explications ici) pour les retours de commandes.

Dernière modification par cqfd93 (Le 25/01/2015, à 13:34)

Hors ligne

#9 Le 27/01/2015, à 10:21

Watael

Re : [Résolu] Besoin d'aide script sh (DSM)

si, mais on a pas eu de retour quant à l'effet du remplacement des tests par une structure plus robuste (if...then...[...]fi)...

il faut, c'est encore une question de bonne pratique, adapter ton shebang au langage que tu utilises : apparemment, bash.
on n'utilise #!/bin/sh que lorsque a un code strictement POSIX.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 27/01/2015, à 10:30

Levi59

Re : [Résolu] Besoin d'aide script sh (DSM)

la suppression du shebang n'a rien changé. je vais changer les tests.

Hors ligne

#11 Le 27/01/2015, à 10:41

Watael

Re : [Résolu] Besoin d'aide script sh (DSM)

suppression modification


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#12 Le 27/01/2015, à 10:52

Levi59

Re : [Résolu] Besoin d'aide script sh (DSM)

J'ai testé donc le passage au if;then;elif;fi et effectivement ça marche mais ça ne m'explique pas pourquoi.

Je pensais que "echo" servait uniquement à envoyer des données sur la sortie standard. Pourquoi sa présence était-elle nécessaire avec l'écriture [ ... ] && ... || ... pour que le script fonctionne ?

Hors ligne

#13 Le 27/01/2015, à 11:09

Watael

Re : [Résolu] Besoin d'aide script sh (DSM)

parce que les tests simples/courts testent la dernière commande exécutée, et non, comme la forme complète/robuste, le test lui-même.

$ true && false || echo faux
faux

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 27/01/2015, à 11:14

Watael

Re : [Résolu] Besoin d'aide script sh (DSM)

allez, cadeau :

__artwork (){
   shared=( {poster,fanart}.jpg ) #on peut le sortir de la fonction.
   test $1 -eq 1 \ 
      && fiList=( "${shared[@]}" logo.png extrafanart.jpg ) \ 
      || fiList=( "${shared[@]}" {clear{art,logo},discart}.png )
   for aw in "${fiList[@]}"
   do  
      f="$3/$2/$aw"
      test -f "$f" || echo "$f" >>"$ListeArtWork"
   done
}

big_smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 27/01/2015, à 12:12

Levi59

Re : [Résolu] Besoin d'aide script sh (DSM)

Ok je comprend mieux ^^
Merci pour ton aide et ce code!

je passe en résolu

Edit : concernant ta proposition de code, j'ai une erreur.

DS414> sh ./recursive-artwork-finder.sh
./recursive-artwork-finder.sh: line 11: syntax error: unexpected "(" (expecting "}")

la ligne 11 c'est la première de la fonction __artwork qui commence par shared

Dernière modification par Levi59 (Le 27/01/2015, à 12:13)

Hors ligne

#16 Le 27/01/2015, à 12:40

Watael

Re : [Résolu] Besoin d'aide script sh (DSM)

tu ne devrais pas exécuter ton script comme ça, car cela passe outre le shebang.
il faut le rendre exécutable, et l'appeler avec son chemin (absolu ou relatif).

$ cat ./test_pathSubst
#!/bin/bash

echo to{to,ta,ti}.ext
$ sh ./test_pathSubst
to{to,ta,ti}.ext
$ ./test_pathSubst
toto.ext tota.ext toti.ext

appeler bash par sh, inhibe certaines de ces extensions.

cependant, cela ne provoque pas cette erreur chez moi; peut-être une erreur de copie ? tu peux nous montrer le code que tu utilises ?

Dernière modification par Watael (Le 27/01/2015, à 12:47)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#17 Le 27/01/2015, à 15:30

Levi59

Re : [Résolu] Besoin d'aide script sh (DSM)

Je n'ai pas bash sur dsm, c'est pour ça que j'utilise sh. C'est probablement à l'origine du problème.

Même erreur avec un coup de chmod et le lancement du script sans sh.

Hors ligne

#18 Le 27/01/2015, à 16:21

Watael

Re : [Résolu] Besoin d'aide script sh (DSM)

"${i/-- Collection --/}"

ce passage devrait également faire planter ton script, car cette substitution n'est pas POSIX.
le shell (lié) à /bin/sh doit donc être soit bash, soit ksh.

¿ chmod ne rend pas ton script exécutable ?
¿ il est exécutable, mais ne s'exécute pas ?
comment le lances-tu ?
si rien n'y fait, essaye avec

sh -c tonScript

d'après ce que j'ai vu rapidement, quand on se connecte au DSM, on atterit dans busybox
avec busybox 1.20, sur Debian, ça fonctionne:

$ busybox sh ./test_pathSubst
to{to,ta,ti}.ext
$ busybox sh -c ./test_pathSubst
toto.ext tota.ext toti.ext
$ ./test_pathSubst
toto.ext tota.ext toti.ext

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#19 Le 27/01/2015, à 17:46

Levi59

Re : [Résolu] Besoin d'aide script sh (DSM)

chmod +x fonctionne et je peux lancer le script sans "sh". et il fonctionne avec l'ancienne fonction mais pas avec ta version...

DS414> echo to{to,ta,ti}.ext
to{to,ta,ti}.ext
DS414> sh -c ./recursive-artwork-finder.sh
./recursive-artwork-finder.sh: line 11: syntax error: unexpected "(" (expecting "}")
DS414> sh


BusyBox v1.16.1 (2015-01-07 14:52:14 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

/volume1/Multimedia # echo to{to,ta,ti}.ext
to{to,ta,ti}.ext
/volume1/Multimedia # type -a bash
/volume1/Multimedia # type -a sh
/bin/sh

avec #!/bin/bash comme shebang :

DS414> ./recursive-artwork-finder.sh
-ash: ./recursive-artwork-finder.sh: not found

Voilà la version fonctionnelle :

#!/bin/sh
# chmod ./recursive-artwork-finder.sh
# Usage : ./recursive-artwork-finder.sh
# ex : ./recursive-artwork-finder.sh

ListeArtwork="/volume1/Autres/liste_artwork.txt"
> "$ListeArtwork"

__artwork ()
{
	if [ $1 -eq 1 ] 
	then
		#test artworks
		for aw in logo.png poster.jpg fanart.jpg extrafanart1.jpg
		do
			if [ ! -f "$3/$2/$aw" ]
			then
				echo "$3/$2/$aw" >> "$ListeArtwork"
			fi
		done
	else
		#test artworks film
		for aw in clearlogo.png poster.jpg fanart.jpg clearart.png discart.png
		do
			if [ ! -f "$3/$2/$2-$aw" ] 
			then
				echo "$3/$2/$2-$aw" >> "$ListeArtwork"
			fi
		done
	fi
}

__rec ()
{
	for i in *
	do
		if [ -d "$i" ]
		then
			#est un dossier
			if [ "${i/-- Collection --/}" != "$i" ]
			then
				#est une collection
				__artwork 1 "$i" "$PWD"
				(cd "$i" && __rec;)
			elif [ "${i% (*}" != "$i" ]
			then
				#est un Film
				__artwork 0 "$i" "$PWD"
			fi 
		fi 
	done
}

for dir in Animation Documentaires Films
do 
	(cd "$dir" && __rec;)
done

Dernière modification par Levi59 (Le 27/01/2015, à 17:57)

Hors ligne

#20 Le 27/01/2015, à 18:18

Watael

Re : [Résolu] Besoin d'aide script sh (DSM)

ce n'est pas très important, par contre tu ne peux pas non plus te servir des tableaux.
tes fichiers ne contenant pas d'espaces dans leur nom, tu peux éventuellement utiliser une variable "plate", sans guillemets :

var="fichier1 fichier2"
var="$var fichier3"
for f in $var; do :...; done

l'important c'est que tes conditions fonctionnent.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne