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 ?

7 réponses

1 2
Avatar
ozzii
Bonjour,

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


C'était bien la redirection qui était mauvaise.
Merci encore

Avatar
Stephane Chazelas
On 2 Mar 2006 06:32:05 -0800, ozzii wrote:
Bonjour,

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


C'était bien la redirection qui était mauvaise.
Merci encore


Pas que, il y a aussi le fait que tu utilises l'operator de
decoupage ("split" dans d'autres languages) sans specifier le
separateur (la valeur par defaut est "space", "tab" ou "newline"
alors que tu veux decouper l'output de grep selon les sauts de
ligne seulement), tu utilises l'operateur de globbing sur le
resulat de grep, (du demande au shell d'"expander" les
"wildcards" dans les mots resultat de ce decoupage), tu ne
passes pas le "-d" a ls (et ls est inutile ici).

set +f # activer le globbing pour toto*
resultat=`ls -d /temp/toto*`

IFS='
' # utiliser seulement <newline> comme separateur
set -f # desactiver le "globbing"
for FIC in $resultat; do
printf '%sn' "$FIC"
done

Sinon,

find /temp/. ( -name . -o -prune )
-name 'toto*'
! -name '*old*'
-exec sh -c '

FIC=$1
printf "whatever with %sn" "$FIC"

' {} {} ;

De cette maniere, on n'a pas de surprise avec les noms de
fichiers inhabituels.

--
Stephane


Avatar
Jean-Marc DURO

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.



Je viens de vérifier ceci sur ksh sous AIX 4.3.3. Merci pour l'info, je
ne m'y attendais pas. Juste une précision: la présence ou l'absence du
warning dépend d'un paramétrage que j'ai oublié. Chez moi, il m'a
demandé si je voulais effacer le fichier avant de le faire.

Cordialement

Jean-Marc

Avatar
lhabert
Jean-Marc DURO :

Chez moi, il m'a demandé si je voulais effacer le fichier avant de le
faire.


Tu aurais pas un « alias rm='rm -i' » ?

Avatar
Stephane Chazelas
On Fri, 03 Mar 2006 12:05:57 +0100, Jean-Marc DURO wrote:

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.



Je viens de vérifier ceci sur ksh sous AIX 4.3.3. Merci pour l'info, je
ne m'y attendais pas. Juste une précision: la présence ou l'absence du
warning dépend d'un paramétrage que j'ai oublié. Chez moi, il m'a
demandé si je voulais effacer le fichier avant de le faire.
[...]


Ca, c'est parce que tu as un alias pour rm qui fait en fait rm
-i, ou que tu n'as pas les permissions d'ecritures sur le
fichier. Dans tous les cas, c'est rm qui fait ca, pas le shell.

--
Stephane


Avatar
Jean-Marc DURO
Jean-Marc DURO :

Chez moi, il m'a demandé si je voulais effacer le fichier avant de le
faire.


Tu aurais pas un « alias rm='rm -i' » ?


Bingo ! C'est bien le cas en effet.

Merci


Avatar
Jean-Marc DURO
On Fri, 03 Mar 2006 12:05:57 +0100, Jean-Marc DURO wrote:
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.

Je viens de vérifier ceci sur ksh sous AIX 4.3.3. Merci pour l'info, je

ne m'y attendais pas. Juste une précision: la présence ou l'absence du
warning dépend d'un paramétrage que j'ai oublié. Chez moi, il m'a
demandé si je voulais effacer le fichier avant de le faire.
[...]


Ca, c'est parce que tu as un alias pour rm qui fait en fait rm
-i, ou que tu n'as pas les permissions d'ecritures sur le
fichier. Dans tous les cas, c'est rm qui fait ca, pas le shell.

C'est ça en effet. Merci




1 2