Bash / lister fichiers avec espaces
Résolu
Le Duc
-
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:
Script pour le traitement
Cela me donne pour l'instant
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 ;-)).
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:
- Bash boucle for liste fichier
- Fichier bin - Guide
- Liste déroulante excel - Guide
- Fichier epub - Guide
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Fichier rar - Guide
3 réponses
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:
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:
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
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
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 :
Où est 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 ???
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
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
Je test demain et je te dit "QUOI" ;-)
Le Duc