Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/10/2006, 09h08   #1
Membre du Club
 
Avatar de domiq44
 
Inscription : novembre 2005
Messages : 203
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : novembre 2005
Messages : 203
Points : 51
Points : 51
Par défaut Boucle sur fichiers et le caractère espace

Bonjour,

Je cherche à faire une action sur tous les fichiers du répertoire "monRep".

Le seul problème et que le nom des fichiers de ce répertoire peuvent contenir un ou plusieurs caractères espace.

Exemple:
Code :
1
2
3
4
5
6
7
8
 
$ ls -1 monRep
...
Copie de toto
dummy
pipo
toto
...
Par conséquent, quelque chose comme cela

Code :
1
2
3
4
5
6
 
for fichier in $(ls monRep)
do
    # faire une action, ici affichage
    echo $fichier
done
ne peut absolument pas convenir car un fichier nommé "Copie de toto" fournira à la boucle "for" les 3 entrées "Copie", "de" et "toto" !!!

Comment faire ?

Merci.
domiq44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 10h02   #2
Membre Expert
 
Avatar de 2Eurocents
 
Inscription : septembre 2004
Messages : 2 180
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : septembre 2004
Messages : 2 180
Points : 2 442
Points : 2 442
Il faut jouer sur le séparateur de champs/d'instructions IFS
Code :
1
2
3
4
5
6
7
IFS=$'\n\t'
for fichier in $(ls monRep)
do
    # faire une action, ici affichage
    echo $fichier
done
unset IFS
__________________
La FAQ Perl est par ici
: La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !
2Eurocents est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 10h50   #3
Membre du Club
 
Avatar de domiq44
 
Inscription : novembre 2005
Messages : 203
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : novembre 2005
Messages : 203
Points : 51
Points : 51
Maintenant ça marche bien pour ces fichiers "Copie de toto"

Mais ça ne marche plus pour les autres

En fait, ça me bouffe certains caracères !?
domiq44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 11h00   #4
Membre Expert
 
Avatar de 2Eurocents
 
Inscription : septembre 2004
Messages : 2 180
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : septembre 2004
Messages : 2 180
Points : 2 442
Points : 2 442
Citation:
Envoyé par domiq44
Mais ça ne marche plus pour les autres

En fait, ça me bouffe certains caracères !?
Saurais-tu être plus précis ?
Habituellement, cela ne pose aucun problème :
Code :
1
2
3
4
5
6
IFS=$'\n\t'
for fichier in $(ls -1)
  do 
    echo "[$fichier]"
done
unset IFS
dans mon répertoire de test, me fournit
Code :
1
2
3
4
5
[img_1.jpg]
[img 2.jpg]
[img_3.jpg]
[img 4.jpg]
[img_5.jpg]
Ce qui correspond parfaitement au contenu.
__________________
La FAQ Perl est par ici
: La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !
2Eurocents est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 11h09   #5
Membre du Club
 
Avatar de domiq44
 
Inscription : novembre 2005
Messages : 203
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : novembre 2005
Messages : 203
Points : 51
Points : 51
Je pense que cela doit venir de mon système de m...e : AIX !!!

Moi j'ai ça :

Code :
1
2
3
4
5
6
7
8
9
 
$ ls -1
img 2.jpg
img 4.jpg
img_1.jpg
img_3.jpg
img_5.jpg
test.sh
$
Code :
1
2
3
4
5
6
7
8
9
 
$ cat test.sh
IFS=$'\n\t'
for fichier in $(ls -1)
  do
    echo "[$fichier]"
done
unset IFS
$
Code :
1
2
3
4
5
6
7
8
9
10
11
 
$ test.sh
[img 2.jpg
img 4.jpg
img_1.jpg
img_3.jpg
img_5.jpg
]
[es]
[.sh]
$
Je ne comprends pas !!!
domiq44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 11h16   #6
Membre Expert
 
Avatar de 2Eurocents
 
Inscription : septembre 2004
Messages : 2 180
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : septembre 2004
Messages : 2 180
Points : 2 442
Points : 2 442
Citation:
Envoyé par domiq44
Je pense que cela doit venir de mon système de m...e : AIX !!!
Mais c'est très bien, AIX ... parfois un peu délicat à l'emploi, mais très bien quand même (surtout les babasses qui le font tourner ).

Effectivement, je vois le problème.
Il vient de l'affectation dans IFS.
AIX interprète le \t et le \n et met alors t et n dans la liste des séparateurs, virant du même coup l'espace (c'est ce qu'on veut), mais aussi la tabulation et le retour à la ligne.
Du coup, tous les t et n sont considérés comme des séparateurs, donc bouffés.

La syntaxe que j'ai utilisé (IFS=$'\t\n') est une syntaxe BASH.
Il doit exister un équivalent sous AIX qui permette d'insérer ces deux caractères de contrôle dans la variable d'environnement.

Bon courage.
__________________
La FAQ Perl est par ici
: La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !
2Eurocents est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 11h52   #7
Membre du Club
 
Avatar de domiq44
 
Inscription : novembre 2005
Messages : 203
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : novembre 2005
Messages : 203
Points : 51
Points : 51
Malheureusement, je ne trouve pas !!!

Est-ce que quelqu'un dans le forum connait la syntaxe ????????
domiq44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 12h00   #8
DIE
Membre à l'essai
 
Inscription : août 2005
Messages : 82
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 82
Points : 24
Points : 24
salut,
je débute en shell mais je suis sous AIX et KSH également.
j'ai eu le meme soucis que toi, je l'ai contourné comme j'ai pu
avec la commande PASTE

Code :
1
2
3
4
5
6
7
8
ls -1 > temp
hello=`paste -s -d";" temp`
IFS=";"
for z in $hello
do
echo $z
done
exit
DIE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 12h52   #9
Membre du Club
 
Avatar de domiq44
 
Inscription : novembre 2005
Messages : 203
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : novembre 2005
Messages : 203
Points : 51
Points : 51
Merci.
Ca marche !
Dans mon cas cela donne ça :

Code :
1
2
3
4
5
6
7
8
9
10
 
$ cat test2.sh
tmpfile=/tmp/tmp.$$
ls -1 > $tmpfile
dummy=$(paste -s -d";" $tmpfile)
IFS=";"
for fichier in $dummy
do
    echo "[$fichier]"
done
domiq44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 15h40   #10
Membre du Club
 
Avatar de domiq44
 
Inscription : novembre 2005
Messages : 203
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : novembre 2005
Messages : 203
Points : 51
Points : 51
Encore mieux !!!

Code :
1
2
3
4
5
 
find monRep -type f | while read fichier
do
    echo "[$fichier]"
done
domiq44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 16h01   #11
DIE
Membre à l'essai
 
Inscription : août 2005
Messages : 82
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 82
Points : 24
Points : 24
ah oui ça marche aussi, mais ça garde le chemin des fichiers
faut faire un BASENAME qq part

tjs plus simple

Code :
1
2
3
4
5
ls | while read fichier
do
echo $fichier
done
exit
le PASTE te servira quand tu voudras concaténer les données
des fichiers
DIE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 16h40   #12
DIE
Membre à l'essai
 
Inscription : août 2005
Messages : 82
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 82
Points : 24
Points : 24
attention à la commande FIND, celle ci scanne automatiquement
le répertoire mais aussi les sous-repertoires...........
pour stopper la descente aux enfers
il faut utiliser l'option -prune

Citation:
-prune Always evaluates to the value True. Stops the descent of the current path
name if it is a directory. If the -depth flag is specified, the -prune flag is
ignored.
DIE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2006, 16h53   #13
Membre du Club
 
Avatar de domiq44
 
Inscription : novembre 2005
Messages : 203
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : novembre 2005
Messages : 203
Points : 51
Points : 51
Je pense que j'ai la réponse à mon problème.

Merci.
domiq44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h14.


 
 
 
 
Partenaires

Hébergement Web