Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Aller à la page:  1 2 Page suivante
Page: 1 sur 2
shell et les espaces ?
Envoyé par: tchoua

bonjour,
je me suis mis en tête d'écrire un script shell. mais depuis 2 jours me casse les dents parce que mon script travaille sur des fichiers qui contiennent des espaces dans leur nom.
ce que je veux faire c'est recupérer la liste de mes fichiers "file 1.txt", "file 2.txt" dans une variable.
je ne parviens pas a le faire, quand je fait echo $files j'obtiens :
file
1.txt
file
2.txt
comment je peux faire ?
voici mon script:

#je recupere la liste des fichiers
files=`ls $1`
#j'affiche pour verrifier
echo "$files"
#pour chaque fichier de la liste je fais
for file in $files; do
#affichier le fichier
echo "test_$file" <<ICI j'obtiens pas ce que je souhaites
done

merci de vos aides

Poste le Wednesday 23 February 2005 03:09:36
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: nicola

Essaie ls file\ 1.txt, avec un \.

--
On ne prête qu’aux riches, et on a bien raison, parce que les autres remboursent difficilement.
-+- Tristan Bernard (1866-1947) -+-

Poste le Wednesday 23 February 2005 07:12:37
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: lloyds

si je comprends bien tu lui passes les noms de ficheirs en arguments.

Si c bien ça ben le problème est tout à fait normal car le shell utilsie une variable de séparation appellé IFS qui par defalt contient espace tabulation et nouvelles lignes donc dès que tu as un espace ce sera un nouvel arguement.
Pour résoudre ton problème tu as 2 solutions:
- ou tu passes tes differents arguments entre simple quotes
- ou sinon tu lui passses en protégeant ton espace par un \

voial si ça marche pas donne nous plus de precision sur tes arguments et la façon dont tu lance ton script

--
Adolescent attardé et fier de l'être

Poste le Wednesday 23 February 2005 10:59:12
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: tchoua

non en fait je ne passe que le non du dossier dans lequel il y a les fichiers "file 1.txt" "file 2.txt" etc...
et mon script fait un ls $1 $1 estant la variable contenant l'URL du dossier en question.
donc je ne passe aucun fichier en argument et c'est bien la tout le problème.
pour lancer mon script je fais donc :
./monScript nomDuDossier

Poste le Wednesday 23 February 2005 20:52:56
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: lloyds

je reflechis pour l'instant ça vient pas mais lma nuit porte conseil j'aurais peute tere la solution demain

--
Adolescent attardé et fier de l'être

Poste le Wednesday 23 February 2005 21:14:36
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: Jonesy's

Bonsoir,

Traite les fichiers par lignes.
$ ls -1
Puis entoure la ligne de guillemets :
$ ls -1 | awk '{ print "\""$0"\"" }'

Là tu pourras aura le nom complet dans ta variable.

@+

--- Marchons seul, sans faire le mal, sans rien attendre, tel l'éléphant qui traverse la forêt. ---

Poste le Wednesday 23 February 2005 21:35:09
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: Jonesy's

PS : c'est ls -"un" et non ls -"L" =|:-)

--- Marchons seul, sans faire le mal, sans rien attendre, tel l'éléphant qui traverse la forêt. ---

Poste le Wednesday 23 February 2005 21:36:46
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: marc ferraton

et les mecs pensez find

#!/bin/bash
for i in `find $1 -depth -maxdepth 1 -type f`
do
echo $i
cat $i
done

çà évite aussi de se prendre les pieds dans le tapis avec les repertoires... ou alors de les parcourir tranquillement, et meme le liens symboliques ...

Poste le Wednesday 23 February 2005 23:25:53
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: tchoua


Citation
marc ferraton
#!/bin/bash
for i in `find $1 -depth -maxdepth 1 -type f`
do
echo $i
cat $i
done
ca ne marche pas mieu et meme le cat $i m'affiche des chose terrible (je pense que c'est parce qu'il fait : l'affichage de : cat file puis cat 1.txt etc...
et ces fichiers n'existent pas.

quand a awk cela marche si je fait ls -1 $1 | awk '{ print "\""$0"\"" }' j'obtiens bien n sortie :
"file 1.txt"
"file 2.txt"
mais si je le met dans mon script
#je recupere la liste des fichiers
files=`ls -1 $1 | awk '{ print "\""$0"\"" }'`
#j'affiche pour verrifier
echo "$files"
#pour chaque fichier de la liste je fais
for file in $files; do
#affichier le fichier
echo "test_$file" <<ICI j'obtiens pas ce que je souhaites
done

j'obtiens :
"file
1.txt"
"file
2.txt"

comment dois je faire ? ?-(

Poste le Thursday 24 February 2005 02:12:23
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: Jonesy's

Bonjour,

En fait c'est un mixte de 3 réponses qu'il faut faire.
Perso je m'étais contenter de donner une partie de la solution pour les espaces

#!/bin/bash
for i in `find $1 -depth -maxdepth 1 -type f | awk '{ print "\""$0"\"" }' | sed "s/ /\\ /g"`
do
echo $i
cat $i
done

Pas tester mais devrais marcher...

@+

--- Marchons seul, sans faire le mal, sans rien attendre, tel l'éléphant qui traverse la forêt. ---

Poste le Thursday 24 February 2005 09:48:43
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: marc ferraton

Citation
tchoua
marc ferraton a écrit :#!/bin/bash
for i in `find $1 -depth -maxdepth 1 -type f`
do
echo $i
cat $i
done
ca ne marche pas mieu et meme le cat $i m'affiche
des chose terrible (je pense que c'est parce qu'il
fait : l'affichage de : cat file puis cat 1.txt
etc...
...
et ces fichiers n'existent pas.
comment dois je faire ?

mais c'est pas possible, pas possible
le cat c'était juste pour te monter que tu pouvait utilidsé une eutre commande ...
donc
----- listefichier.sh ---------
#!/bin/bash
for i in `find $1 -type f -maxdepth 1`
do
echo $i
# cat $i
done
------------------------------
et le résultat
bash-2.05b$ ./listefichier.sh /tmp
/tmp/example.BNd9xA
/tmp/example.0MdiUc
/tmp/example.GHwk6Z
/tmp/.X0-lock
/tmp/example.FwZsTg


Poste le Thursday 24 February 2005 11:18:57
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: marc ferraton

oups je deconne, j'ai mal lu le probleme, 3 coups de fouet ce soir...

----- listefichier.sh ---------
#!/bin/bash
# la variable IFS est le séparateur par defaut,
# donc on le sauvegarde pour le restituer au cas on on aurait besoin après
ifs_save=$IFS
IFS=''
for i in `find $1 -type f -maxdepth 1`
do
echo $i
# cat $i
done
--------------------------------

bash-2.05b$ ./listefichier.sh /tmp
/tmp/example.BNd9xA
/tmp/example.0MdiUc
/tmp/example.GHwk6Z
/tmp/.X0-lock
/tmp/example.FwZsTg
/tmp/avec des espaces

Poste le Thursday 24 February 2005 11:28:26
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: tchoua

Citation
Jonesy's
#!/bin/bash
for i in `find $1 -depth -maxdepth 1 -type f | awk '{ print "\""$0"\"" }' | sed "s/ /\\ /g"`
do
echo $i
cat $i
done
Ca ne marche pas voila ce que j'obtiens :
"directory/file
cat: "directory/file: No such file or directory
1.txt"
cat: 1.txt": No such file or directory
"directory/file
cat: "directory/file: No such file or directory
2.txt"
cat: 2.txt": No such file or directory


Citation
marc ferraton
#!/bin/bash
# la variable IFS est le séparateur par defaut,
# donc on le sauvegarde pour le restituer au cas on on aurait besoin après
ifs_save=$IFS
IFS=''
for i in `find $1 -type f -maxdepth 1`
do
echo $i
# cat $i
done
ca marche mais j'ai pas compris comment IFS resoud mon problème ?
connaissez vous une doc qui puisse bien m'expliquer comment IFS marche ?
merci pour toutes votre aide. :-)

Poste le Thursday 24 February 2005 20:57:16
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: marc ferraton

man bash
IFS est la variable de séparateur de champ, si tu le defini comme chaine nulle , il n'y a plus de separateur seul reste le separateur d'enregistrement \0

et voili, voilà, enfin c'est mieux de se fendre de l'ouvrage "LINUX in a nutshelll" chez O'Reilly, une mine d'info

merci aux traducteurs Alain Nadeau et Jean Michel Vansteene winking smiley
sans pub particulière,


Poste le Thursday 24 February 2005 21:07:06
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: tchoua

comment dire a IFS de garder les sauts de lignes comme separateur.
faut il taper IFS="\n" ?

Poste le Thursday 24 February 2005 23:20:23
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: marc ferraton

non c'est plus drole
il faut mettre dans ton shell
IFS=\

et tu fais planter dans les 3 jours qui suivent avec un shell qui marche plus sans comprendre pourquoi ( le \ interpreté , pas interpreté ? enfin pas cool )

sinon plus serieux comme çà
newline='
'
IFS="${IFS= }"; save_ifs="$IFS"; IFS=$newline

tiens un exemple
function start_pcweb {

newline='
'
   IFS="${IFS=   }"; save_ifs="$IFS"; IFS=$newline
   for i in `cat ${ConfigPathFilePcWeb}${ConfigFilePorts} | sed 's/#.*//' | sed '/^$/d'`
   do
        # extraire la commande a executer

        pw_fonction=""
        pw_cnx=""
        pw_equip=""
        pw_bigindian=""
        pw_file=""
        pw_style=""
        pw_device=""
        pw_protocol=""
        pw_adresse=""
        pw_libelle=""

#       IFS=$save_ifs

        #--------------------------------------------------
        # on evalue chacune des entrees du fichier pcweb_ports
        eval param_pcweb $i
        # exemple
        #-n 0   -f srv   -e LOOP     -s loop  -d /dev/pcweb_loop  -p loop    -a 0 -I -L \'"Réservé--------------"\'
...
...

Poste le Friday 25 February 2005 00:20:48
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: tchoua

Ok j'ai trouve il faut faire :
IFS='
'
mais apres le script separe encore sur les blancs
ifs_save=$IFS
IFS='
'
for i in `find $1 -type f -maxdepth 1`
do
echo $i
# cat $i
done

je n'aurais jamais cru que ce soit aussi compliqué de gerrer les espaces dans les noms de fichiers.
comment je peux faire j'ai besoin d'avoir dans $i le nom d'un fichier a la fois et pas toute la liste des fichiers.

Poste le Friday 25 February 2005 00:24:17
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: marc ferraton

Citation
tchoua
Ok j'ai trouve il faut faire :
IFS='
'
mais apres le script separe encore sur les
blancs
c'est bon ou c'est pas bon ????? ;-p

Citation
tchoua
ifs_save=$IFS
IFS='
'
for i in `find $1 -type f -maxdepth 1`
do
echo $i
# cat $i
done
je n'aurais jamais cru que ce soit aussi compliqué
de gerrer les espaces dans les noms de fichiers.

çà marche ici ?

Citation
tchoua
comment je peux faire j'ai besoin d'avoir dans $i
le nom d'un fichier a la fois et pas toute la
liste des fichiers.

et bien dans $i tu n'en as qu'un
quand tu fais echo $i il t'indique que le nom d'un fichier


je ne te comprends pas ....



L'homme qui parlait à l'oreille des PC @#%!

Poste le Friday 25 February 2005 00:37:03
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: tchoua

IFS=
for i in `find $1 -type f -maxdepth 1`
do
echo $i
done

si je met IFS=
sans rien stipuler comme seprarateur il ne va pas couper les lignes obtenus. du coups dans la variable $i j'ai la totalite des fichiers contenus dans le dossier. la j'ai bien les nom de fichiers dans leur totalite mais je le ais tous d'un bloc.
dons echo "$i" me donne :
directory/file 1.txt
directory/file 2.txt

et il ne passe qu'une fais dans le boucle for donc j'ai les 2 ligne dans la variable $i !

par contre si je fais :
IFS='
'
for i in `find $1 -type f -maxdepth 1`
do
echo $i
done

je veux qu'il separe les ligne au retour chariot (CR) mais pas au " " (espace) je met donc dans IFS un saut de ligne.
j'obtiens :
directory/file
1.txt
directory/file
2.txt

et je me retrouve au problème de depart :,(
donc je ne parvient pas a avoir dans ma variable $i le nom d'un seul fichier avec sons espace dans le nom.

Poste le Friday 25 February 2005 01:14:48
Répondre     Citer    
Re: shell et les espaces ?
Envoyé par: marc ferraton

bon voilà ton script
--------------------------------------
#!/bin/bash
ifs_save=$IFS
IFS='
'
for i in `find $1 -type f -maxdepth 1`
do
echo "nouvelle boucle"
echo $i
# cat $i
done
-----------------------------------------

et voilà le résultat
c'est bien ce que tu veux ?

bash-2.05b$ ./listefichier1.sh ../essais/
nouvelle boucle
../essais/mafonction.awk
nouvelle boucle
../essais/printcap.awk
nouvelle boucle
../essais/multiligne.sed
nouvelle boucle
../essais/meslog.awk
nouvelle boucle
../essais/fic 1.txt
nouvelle boucle
../essais/listefichier1.sh
nouvelle boucle
../essais/liste fichier.sh
nouvelle boucle
../essais/fic 2.txt

donc si çà ne marche pas comme çà ????
1) tu n'as pas mis
#!/bin/bash
à la 1re ligne
et c'est un autre shell qui est lancé, qui ne fonctionne pas de la meme facon...


2) il y a une option pour bash dans ton environnemen qui coince...
ex
echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor




Poste le Friday 25 February 2005 01:32:51
Répondre     Citer    
Aller à la page:  1 2 Page suivante
Page: 1 sur 2

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
shell et les espaces ?
Posez dans ce forum les questions qui ne trouvent pas place dans les autres...
Nouveau sujet sur ce forum

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons