#1 Le 15/10/2012, à 03:16
- Otyugh
[Résolu]Meilleur moyen d'itérer sur les fichiers d'un dossier
Bonjour,
récemment j'ai voulu faire un traitement sur des fichiers d'un dossier.
Seulement voilà : les espaces me foutent tout en l'air.
for file in $(ls -d1 .)
S'il y a un fichier "truc muche" dans le dossier courant, la valeur de $file prendra successivement "truc" puis "muche".
Je pensais sauver la journée en mettant ce "1" à ls, forçant les séparations, mais le problème est toujours là. :-/
Ce problème est assez courant pour que je vois des débuts de réponse, mais rien de bien clean/portable. J'espère que j'ai énoncé correctement ^^
Dernière modification par Otyugh (Le 17/10/2012, à 19:00)
Hors ligne
#2 Le 15/10/2012, à 05:46
- bishop.sad.clown
Re : [Résolu]Meilleur moyen d'itérer sur les fichiers d'un dossier
avec les guillemets :
→ rob @bscc-01 - /stock/rob/work $ for i in $(ls -d *) ; do echo "$i" ; done
retest
retest
test
test
→ rob @bscc-01 - /stock/rob/work $ for i in "$(ls -d *)" ; do echo "$i" ; done
retest retest
test test
@++ , Rob'
→ Trusty x64
Je n'ai pas toujours les réponses mais je les cherche en même temps que vous... =· þ
Hors ligne
#3 Le 15/10/2012, à 06:21
- pingouinux
Re : [Résolu]Meilleur moyen d'itérer sur les fichiers d'un dossier
Bonjour,
for i in *; do echo "$i"; done
Hors ligne
#4 Le 15/10/2012, à 07:09
- nesthib
Re : [Résolu]Meilleur moyen d'itérer sur les fichiers d'un dossier
La solution proposée par pingoulinux est la plus simple et la meilleure avec une version récente de bash.
Voici une solution plus portable :
while read fichier
do
echo "→${fichier}←"
done < <(find .)
« find . » peut être remplacé par « ls »
NB. le seul cas où ça ne fonctionne pas est celui pour lequel le fichier comporte un saut de ligne (\n).
Un palliatif :
while read -d $'\0' fichier
do
echo "→${fichier}←"
done < <(find . -print0)
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#5 Le 15/10/2012, à 11:36
- Postmortem
Re : [Résolu]Meilleur moyen d'itérer sur les fichiers d'un dossier
Salut,
La solution de pingouinux est la meilleure et la plus portable à mon avis. Elle fonctionne en bash, en ksh et en sh. Le développement de * se fait correctement depuis longtemps il me semble. En fait, j'ai jamais vu de cas où ça ne fonctionnait pas.
bash$ touch fic1 'fic 2' ' fic3 ' 'fic\ 4' 'fic
> 5'
bash$ sh
sh$ for fichier in *
> do
> echo "=>$fichier<="
> done
=> fic3 <=
=>fic
5<=
=>fic 2<=
=>fic1<=
=>fic\ 4<=
Le problème de la solution avec la boucle while avec read et find est qu'il faut un find avec l'option -print0 et il faut aussi un read avec les options -d et également -r (sans -r, on perd les \). Il faut aussi modifier la variable IFS, sinon on perd les espaces au début ou à la fin des fichiers :
bash$ while read -d $'\0' fichier
> do
> echo "=>$fichier<="
> done < <(find . -type f -print0)
=>./ fic3<= <= On a perdu des espaces à la fin
=>./fic 4<= <= Perte de \
=>./fic
5<=
=>./fic1<=
=>./fic 2<=
bash$ while IFS= read -rd $'\0' fichier
> do
> echo "=>$fichier<="
> done < <(find . -type f -print0)
=>./ fic3 <=
=>./fic\ 4<=
=>./fic
5<=
=>./fic1<=
=>./fic 2<=
Bon, j'avoue que des fichiers avec des blancs au début ou à la fin ou même avec des \, ça court pas les rues !
Trusty Tahr (64 bits)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#6 Le 15/10/2012, à 13:02
- Otyugh
Re : [Résolu]Meilleur moyen d'itérer sur les fichiers d'un dossier
for i in "*"; do echo $i; done
Tout le monde s'accorde à dire que la version de pingouinix était la plus simple, pourtant sur mon terminal, il semble se faire piéger par les espaces.
L'ajout des guillemets
Edition :
...fait que i prend l'intégralité de "*" dans i en une fois (un seul tour dans la boucle).
En fait, j'y arrive toujours pas. Je retente vos solutions plus doucement ce soir !
Dernière modification par Otyugh (Le 15/10/2012, à 13:39)
Hors ligne
#7 Le 15/10/2012, à 13:47
- pingouinux
Re : [Résolu]Meilleur moyen d'itérer sur les fichiers d'un dossier
Ce n'est pas
for i in "*"; do echo $i; done
mais
for i in *; do echo "$i"; done
Hors ligne
#8 Le 15/10/2012, à 21:40
- Otyugh
Re : [Résolu]Meilleur moyen d'itérer sur les fichiers d'un dossier
Ho, excusez-moi.
Je voulais simplifier ma question, mais j'ai du coup pas été assez exact.
"*" marche très bien, j'essayais avec un "$(ls)" à la place, cela ne fonctionnait pas.
Mais en finalité, mon but est de lister des dossier, avec la commande
ls -d1 ./*/
Désolé pour le quiproquo, ta solution était bonne. J'ai cru que tu sous-entendais "remplace * par ton expression du ls", ben... Je suis allé trop vite en besogne. Pardon ^^
Hors ligne