Contenu | Rechercher | Menus

Annonce

Les adresses laposte.net ne permettent pas de recevoir nos emails. Vous êtes invité à changer d'adresse dans vos paramètres de compte à votre prochaine connexion.

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 15/10/2012, à 02: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, à 18:00)

Hors ligne

#2 Le 15/10/2012, à 04: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, à 05: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, à 06: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ᴉsdn

Hors ligne

#5 Le 15/10/2012, à 10: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, à 12: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, à 12:39)

Hors ligne

#7 Le 15/10/2012, à 12: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, à 20: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