> filen=`sed -ne 's/\tfilename //p' fichier.txt `
>
> [...] avec un "for $filen" j'ai bien mes nom de fichiers
> sauf si le nom de fichier contient un espace
Désolé pour la réponse tardive, mais, en ce moment, je ne peux pas
envoyer du courriel (problème de DKIM) -- si vous êtes chez OVH, je
serais
curieux de savoir comment vous faites.
Si "fichier.txt" contient le nom, avec ou sans espaces, d'UN fichier,
précédé d'un TAB et d'un espace, par ligne, alors ceci pourrait faire
ton affaire :
sed 's/\tfilename //' fichier.txt |
while IFS= read i ; do
cmd
...
cmd
done
Cependant, le stdin du bloc "do .. done" est la pipe : si une des
"cmd" lit son stdin, elle épuisera ce que "sed" écrit dans la pipe,
et seule la première ligne sera lue par "read". C'est facile à
corriger :
{
sed 's/\tfilename //' fichier.txt |
while IFS= read <&3 i ; do
cmd utilisant "$i"
...
cmd utilisant "$i"
done 3<&0 <&4
} 4<&0
En clair :
- "4<&0" : on duplique le stdin du shell sur fd 4 ;
- "3<&0 <&4" : on duplique la pipe (stdin de "while ... done") sur fd
3
pour l'usage de "read" ; on redirige le stdin du bloc "do ... done" vers
fd 4, qui est une copie du stdin du shell.
On peut aussi utiliser un "here document" comme ceci, avec moins de
redirections :
while IFS= read <&3 i ; do
cmd
...
cmd
done 3<<eof
$(sed 's/\tfilename //' fichier.txt)
eof
Et on peut même se passer de "fichier.txt" :
while IFS= read <&3 i ; do
cmd
...
cmd
done 3<<eof
$(find dir -type f -name "..." -print)
eof
On pourrait aussi utiliser "find ... print0" pour être vraiment sûr
qu'on obtient le véritable nom du fichier (dans un nom de fichier, tout
caractère est admis, sauf le '/' et le '0') :
find dir -type f -name "..." -print0 |
xargs -a /dev/fd/3 -0rn 1 sh -c 'cmd "$0"' 3<&0
'xargs' lit les noms des fichiers, terminés par un '0', un par un, sur
fd 3,
et les passe à "sh -c" comme "$0" (man page de bash, option "-c") ; il
préserve aussi le stdin de "sh -c" et ses commandes.
-Nicolas Tripon