Bash / lister fichiers avec espaces

Résolu
Le Duc -  
 Le Duc -
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 ;-)).

3 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

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

      Le Duc
      0
  2. Le Duc
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
  3. Le Duc
     
    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