Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".

#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

@++
Xubuntu SAUCY sur laptop Asus X54H & Xubuntu TRUSTY sur laptop  Asus eeepc 1215N et laptop HP Envy M6
Xubuntu PRECISE sur desktop Fujitsu-Siemens
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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdnGMT-4

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 !


Raring Ringtail (64 bits), Athlon64 3800+, ATI Radeon HD4870

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

Haut de page ↑