[gull] bash>for>word
Marc SCHAEFER
schaefer at alphanet.ch
Fri Dec 5 13:41:01 CET 2003
On Fri, Dec 05, 2003 at 01:11:25PM +0100, BRINER Cedric wrote:
> mais le problème est que le `for' interprète les espaces des artistes:
Faisons une expérience:
schaefer at defian:/tmp/tt% mkdir abcd "un repertoire etrange" "truc"
schaefer at defian:/tmp/tt% for i in *; do echo $i; done
abcd
truc
un repertoire etrange
schaefer at defian:/tmp/tt% date > un\ repertoire\ etrange/bla
schaefer at defian:/tmp/tt% date > abcd/t1
schaefer at defian:/tmp/tt% for i in *; do echo $i; for j in "$i"/*; do echo " $j"; wc -c "$j"; done; done
abcd
abcd/t1
29 abcd/t1
truc
truc/*
wc: truc/*: No such file or directory
un repertoire etrange
un repertoire etrange/bla
29 un repertoire etrange/bla
La variable i est bien correctement assignée. Et le reste fonctionne
aussi, tant qu'on utilise des guillemets.
Ton problème est la boucle for interne. Mais il y a deux contraintes
incompatibles:
- il faut éviter l'interprétation des espaces
- il faut étendre les jokers *
J'aurais écrit ton script ainsi:
for artist in /mp3/*
do
for album in "$artist"/*
do
./script "$artist $album"
done
done
Mais il est clair qu'on arrive aussi aux limites du shell. Le langage
Perl offre des fonctions sécurisées -- en particulier l'open() à 3
arguments (handle, mode, nom).
Sinon on peut aussi utiliser les options -0 ou print0 de diverses
commandes comme find, xargs, grep, etc, qui terminent les noms de
fichiers par des ASCII 0 (NUL) plutôt qu'avec des séparateurs.
find /mp3 -type f -print0 | xargs -0 -n1 ./script
> simplement une variable du bash qui gere ca?
Il y a bien l'Input Field Separator (IFS), mais je ne jouerais pas
avec ça.
More information about the gull
mailing list