Bash / lister fichiers avec espaces

Résolu/Fermé
Le Duc - 7 déc. 2010 à 17:13
 Le Duc - 8 déc. 2010 à 14:17
Bonjour,

Pour faire simple, je voudrais mettre une liste de dossier dans un fichier txt qui sera appelé par un script pour effectuer un traitement.
Mon problème est que pour chaque espace le script voit un autre nom de dossier:

fichier txt avec le nom des dossiers:
Documents and Settings
Program Files
linux


Script pour le traitement

#!/bin/bash
...
list_dir='cat fichier.txt'

for dir in $list_dir
do
    echo $dir
done
...


Cela me donne pour l'instant
Documents
and
Settings
Program 
....


Et forcément, cela à peu d'intérêt pour faire le traitement sur mes dossiers...

Je vais avoir pas mal de nom de dossier à ajouter, je voudrais donc que le format dans le fichier.txt soit assez sympa (genre un simple copier coller avec un nom de dossier
 par ligne ce serait le must). 

J'ai essayé avec un \ devant les espace, avec des , ou ; mais rien de concluant.
Je peux changer aussi bien le fichier.txt que le code du traitement.

Qui à une idée ???
D'avance merci ;-)).


A voir également:

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
7 déc. 2010 à 17:32
Salut,

Voir dans la FAQ : Comment lire un fichier ligne par ligne ;-))
1
Merci JipiCy,
Je test demain et je te dit "QUOI" ;-)

Le Duc
0
Bonjour,
Effectivement à l'aide du tutoriel j'arrive maintenant à avoir le nom de dossier correctement dans ma boucle, par contre, cela ne règle pas le problème des espaces dans le nom de dossier, car même si je mets des \ devant les espaces dans mon fichier.txt, lorsque j'affiche le nom de dossier ils disparaissent...
Je vais procéder avec un sed, du genre:

while read dir   
do   
    dir_name='echo $dir | sed 's/\ /\\\ /g'' 
    echo $dir_name 
done < fichier.txt 



Si quelqu'un à plus propre, je suis preneur.

Merci

J'ai trouvé, un peu plus loin dans le même tutoriel, dsl...
Voici la boucle finale pour ceux qui aurait le même problème:
fichier.txt:
Documents\ and\ Settings
Program\ Files
linux


old_IFS=$IFS    # sauvegarde du séparateur de champ  
IFS=$'\n'                       # nouveau séparateur de champ, le caractère fin de ligne  

for dir in $(cat fichier.txt)  
do  
   echo "cp -r $dir /new_path/$dir"
done  
IFS=$old_IFS     # rétablissement du séparateur de champ par défaut


Ce qui me donne bien :
cp -r Documents\ and\ Settings /new_path/Documents\ and\ Settings
cp -r Program\ Files /new_path/Program\ Files
cp -r linux /new_path/linux

Merci pour votre aide.
A+


Le Duc
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
8 déc. 2010 à 11:20
J'ai du mal à comprendre ton problème ;-\

Voilà ce que donne chez moi une boucle sur une liste de fichier avec des espaces et l'affichage de leur nom :

$ ls
Celui de tout le monde/  fich  Le dossier de tata/  Le tien/  Mon dossier/  toto/

$ cat fich
Celui de tout le monde
Le dossier de tata
Le tien
Mon dossier
toto

$ while read line; do echo $line; done < fich
Celui de tout le monde
Le dossier de tata
Le tien
Mon dossier
toto

$

Où est ton problème ???
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
8 déc. 2010 à 11:26
Avec une boucle "for" au cas ou...

$ OIFS=$IFS;IFS=$'\n';for line in $(cat fich); do echo $line; done;IFS=$OIFS
Celui de tout le monde
Le dossier de tata
Le tien
Mon dossier
toto
$
0
En fait il n'y a plus de problèmes, grace à ton lien vers le tutoriel j'avais trouvé ma réponse.
Je l'ai posté juste pour permettre à tout le monde d'en profiter.
Je renouvel donc mon merci pour ton aide.

Sinon, histoire de m'expliquer, mon problème avec le code que tu affiches, c'est que j'utilise le nom de dossier pour lancer une commande.
si tu fais un cp sur : "le dossier de tata", tu risques de ne pas avoir le résultat voulu.
Si l'on met des \ devant " " dans le fichier.txt, ils n'apparaissent pas lorque l'on se trouve dans la boucle while. Par contre ont les retrouve bien si l'on fait un for avec le changement de séparateur (comme tu le montres dans ton exemple)
Donc tout est ok.
Tu peux tager le POST en résolu.

Encore merci pour ton aide.

Le Duc
0