Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Boucle for avec ls

17 réponses
Avatar
ozzii
Bonjour,

j'ai ceci:
for FIC in `ls /temp/toto*|grep -v old 2>>/dev/null`
do
echo "$FIC"
done

m=EAme avec la redirection de l'erreur, j'ai quand m=EAme l'erreur
suivant :
ls : 0653-341 Le fichier /temp/toto* n'existe pas.

Comment faire pour ne pas avoir de message d'erreur ?

10 réponses

1 2
Avatar
Stephane Chazelas
On 28 Feb 2006 02:57:06 -0800, ozzii wrote:
Bonjour,

j'ai ceci:
for FIC in `ls /temp/toto*|grep -v old 2>>/dev/null`
do
echo "$FIC"
done

même avec la redirection de l'erreur, j'ai quand même l'erreur
suivant :
ls : 0653-341 Le fichier /temp/toto* n'existe pas.

Comment faire pour ne pas avoir de message d'erreur ?



set -f # on veut que le shell expande /temp/toto*, mais pas
# qu'il expande chaque mot resultat du splitting de `...`
IFS='
' # le splitting de `...` doit etre fait sur les sauts de ligne

for FIC in `set +f; ls -d /temp/toto* 2> /dev/null |grep -v old`
do
printf '%sn' "$FIC"
done

(tu redirigeais la sortie d'erreur de grep, pas celle de ls).


Mais pourquoi pas:

for FIC in /tmp/toto*; do
case $FIC in
*old*) continue;;
esac
printf '%sn' "$FIC"
done


Avec zsh:

print -rl /tmp/toto*~*old*

(il faut peut-etre l'option extendedglob).

--
Stephane

Avatar
Nicolas George
Stephane Chazelas wrote in message
:
Avec zsh:

print -rl /tmp/toto*~*old*


/tmp/toto*~*old*(N) pour ne pas avoir d'erreur quand aucun fichier n'est
trouvé.

(il faut peut-etre l'option extendedglob).


Oui, pour l'opérateur ~.

Avatar
Stephane Chazelas
On Tue, 28 Feb 2006 11:59:16 +0000 (UTC), Nicolas George wrote:
Stephane Chazelas wrote in message
:
Avec zsh:

print -rl /tmp/toto*~*old*


/tmp/toto*~*old*(N) pour ne pas avoir d'erreur quand aucun fichier n'est
trouvé.


Ben, je prefere avoir une erreur qu'une ligne vide, c'est plus
parlant.

OK pour:

for f in /tmp/toto*~*old*(N); do

ou

files=(/tmp/toto*~*old*(N))

par contre.

(il faut peut-etre l'option extendedglob).


Oui, pour l'opérateur ~.



--
Stephane


Avatar
Etienne de Tocqueville
"ozzii" a écrit sur fr.comp.os.unix :

Bonjour,

j'ai ceci:
for FIC in `ls /temp/toto*|grep -v old 2>>/dev/null`
do
echo "$FIC"
done

même avec la redirection de l'erreur, j'ai quand même l'erreur
suivant :
ls : 0653-341 Le fichier /temp/toto* n'existe pas.

Comment faire pour ne pas avoir de message d'erreur ?


C'est pas le grep qui fait l'erreur, mais le ls. De plus, le ">>" n'a
pas d'avantage par rapport au ">" quand c'est pour rediriger vers
/dev/null, donc :

for FIC in `ls /temp/toto* 2>/dev/null |grep -v old`
do
echo "$FIC"
done

Avatar
Stephane Dupille
Comment faire pour ne pas avoir de message d'erreur ?
C'est pas le grep qui fait l'erreur, mais le ls.



Non, ce n'est pas ls qui fait l'erreur, c'est le shell qui fait
l'expansion des *.

De plus, le ">>" n'a
pas d'avantage par rapport au ">" quand c'est pour rediriger vers
/dev/null,


Oui.

donc :
for FIC in `ls /temp/toto* 2>/dev/null |grep -v old`
do
echo "$FIC"
done


Non :
[gimli] ~> ls /temp/toto* 2>/dev/null
zsh: no matches found: /temp/toto*

--
DM> J'arrive seulement sur ce groupe de discussion .Que faut il faire ?
Rien, il n'y a absolument rien d'autres à faire que taper son message en
répondant au groupe, ou pourquoi pas un nouveau message. Rien d'autres
-+- E in Guide du Neuneu Usenet - Mais où ce qu'il est-il donc ? -+-


Avatar
Etienne de Tocqueville
Stephane Dupille a écrit sur fr.comp.os.unix :

Non :
[gimli] ~> ls /temp/toto* 2>/dev/null
zsh: no matches found: /temp/toto*


Chez moi ça marche !

Cela dit, j'utilise des shell normaux, style "sh" et compatibles ! ;-)

Avatar
ozzii
Désolé pour le délai.
Je test tout à l'heure et je vous dis.
P.S. Je suis sous AIX et Solaris.
Avatar
Stephane Dupille
Non, ce n'est pas ls qui fait l'erreur, c'est le shell qui fait
l'expansion des *.
Je n'avais pas vu ça, j'y réponds avec un peu de retard :

C'est bien le shell qui effectue l'expension des "*", mais si rien ne
correspond, il laisse le masque et ne génère pas d'erreur. Je parle du
shell "sh" standard, et des shells compatibles, dans leur configuration
par défaut.


Il y a peu de chances que ton sh soit un vrai sh. A mon avis, et au
pif, ce doit plutôt être un bash en mode réduit.

C'est donc le ls qui indique ne pas trouver le fichier "/temp/toto*", et
pas sh qui dit ne pas trouver de fichier correspondant à /temp/toto*


Beuark ! Complètement cradingue comme comportement. Il laisse passer
des * sans les quoter. Ce qui fait que le comportement de la commande
en général, et de l'expansion en particulier n'est pas cohérent.

Au moins, zsh est cohérent.

Pour le zsh, tu as raison, ce qui prouve que c'est un mauvais shell
qu'il ne faut surtout pas conseiller si on souhaite faire quelque chose
de portable.


C'est un bon shell : il est configurable. Par exemple, on peut
décider de ne pas générer d'erreur, mais de ne pas exécuter du tout la
commande lorsque l'expansion échoue. Ce qui est plus propre que de
lancer n'importe quoi au petit bonheur la chance.

--
Je parie un poste que t'as jamais news reader dedans alors stp arrete
parler d'un groupe que tu ne lis pas... Super argument ca fait
vachement le debat...
-+- CA in : Guide du Neuneu Usenet - Tu t'es vu quand t'as bu -+-


Avatar
Stephane Chazelas
On 02 Mar 2006 07:21:23 +0100, Etienne de Tocqueville wrote:
[...]
Par exemple :

$ sh
# /bin/echo /temp/toto*
/temp/toto*

C'est donc le ls qui indique ne pas trouver le fichier "/temp/toto*", et
pas sh qui dit ne pas trouver de fichier correspondant à /temp/toto*

Pour le zsh, tu as raison, ce qui prouve que c'est un mauvais shell
qu'il ne faut surtout pas conseiller si on souhaite faire quelque chose
de portable.


zsh se comporte POSIXement (c'est a dire non correctement de mon
point de vue), quand il est appelé "sh" (ou "ksh"), et se
correctement quand il est appelé zsh.

Avec les shells autres que zsh (et (t)csh)

rm [ab]*

Effacera un fichier appelé "[ab]*" sans aucun warning s'il n'y a
pas de fichier dont le nom commence par "a" ou "b" dans le
repertoire courant.

Si on ecrit un script avec

#! /bin/zsh -

alors on peut utiliser des specificités zsh, il n'est pas
question de portabilité (a part peut-etre entres versions de
zsh).

Si on ecrit un script sans ligne "#!".

alors on utilise une syntaxe POSIX et zsh comme tout autre shell
qui essaie d'etre POSIX (ou d'avoir un mode POSIX) sauront
l'interpreter de la facon standard.

Si on ecrit un script avec "#! /bin/sh -" alors ca va dependre
des systemes, certains on encore un Bourne shell en /bin/sh
donc on ne peut pas forcement utiliser une syntaxe Unix/POSIX
dans son script si on veut etre portable, il faut se contenter
d'une syntax Bourne (en evitant les points de conflit entre
Bourne et POSIX). Et encore une fois, si /bin/sh est zsh, alors
il saura interpréter un script Bourne, a la maniere standard.

--
Stephane

Avatar
Stephane Chazelas
On Thu, 02 Mar 2006 11:21:35 +0100, Stephane Dupille wrote:
Non, ce n'est pas ls qui fait l'erreur, c'est le shell qui fait
l'expansion des *.
Je n'avais pas vu ça, j'y réponds avec un peu de retard :

C'est bien le shell qui effectue l'expension des "*", mais si rien ne
correspond, il laisse le masque et ne génère pas d'erreur. Je parle du
shell "sh" standard, et des shells compatibles, dans leur configuration
par défaut.


Il y a peu de chances que ton sh soit un vrai sh. A mon avis, et au
pif, ce doit plutôt être un bash en mode réduit.
[...]


Ca ne veut rien dire, "un vrai sh".

La commande "sh" a été au court des ans sous Unix un Thomson
shell, parfois mashey, puis un Bourne shell, puis un Almquist
shell (BSD) ou un SysV shell (la suite du Bourne shell, SysV),
puis des variations sur ksh, bash, ash ou zsh.

Aujourd'hui "sh" est standardisé par la Single Unix
Specification. bash, ksh et zsh implementent (parfois dans un
mode specific) ce standard avec plus ou moins de success (ce qui
ne les empeche pas d'avoir des extensions propres, que la SUS
autorise). Il faut bien noter que le Bourne shell n'est pas
conformant, donc n'est pas un shell Unix compliant dans le monde
Unix d'aujourd'hui.

--
Stephane



1 2