Il m'arrive souvent de récupérer la sortie l'un ls ou d'un find dans une variable du shell. Seulement voilà, le shell découpe ces noms quand il y a un caractère espace et on peut se retrouver avec deux items au lieu d'un seul dans une commande for.
Afin de découper correctement une liste de noms, il faut modifier (temporairement, localement) la variable d'environnement IFS pour obtenir le découpage voulu. Un peu de code vaut mieux qu'un long discours.
Affichage du répertoire courant :
(IFS=$(echo -e "\n\r") ; for f in $(ls) ; do echo "-> $f" ; done)
Idem, mais avec les valeurs hexa de \n et \r
(IFS=$(echo -e "\x0A\x0D") ; for f in $(ls) ; do echo "-> $f" ; done)
Explications :
- parenthèse de gauche : démarre un sous-shell pour isoler cette portion de code (parce que peut-être que d'autres portions peuvent être perturbée par la nouvelle valeur d'IFS)
- IFS=$(echo -e "\n\r") : on met dans IFS le résultat de l'affichage de la commande echo en évaluant (-e) l'expression qui suit.
- Y'a plus qu'à.
Un autre exemple avec find et une tabulation horizontale comme séparateur :
(IFS=$(echo -e "\t") ; for f in $(find . -printf "%p\t") ; do echo "-> $f" ; done)
Pour vider IFS : unset IFS
Et n'oubliez pas, pour remettre d'applomb votre terminal : reset (ça sert surtout quand le teminal affiche n'importe quoi comme police).
# Utiliser while
Posté par dvrasp . Évalué à 1.
ls | while read f
do
echo "$f"
done
Si la liste est grande, tout est mis en mémoire d'un coup avec une boucle for, avant même que la boucle ne commence. Avec read, on a vraiment un traitement ligne par ligne.
[^] # Re: Utiliser while
Posté par platinum . Évalué à 1.
[^] # Re: Utiliser while
Posté par Xoz . Évalué à 1.
[^] # Re: Utiliser while
Posté par fasthm . Évalué à 2.
E4 de http://www.faqs.org/faqs/unix-faq/shell/bash/
suggère que ça ne marche pas, et je me suis déjà heurté à
des problèmes en procédant comme ça.
ceci dit, je n'ai pas mieux en tête comme ça là sur le moment :-)
La gent féminine, pas la "gente", pas de "e" ! La gent féminine ! Et ça se prononce comme "gens". Pas "jante".
# plus simple
Posté par lugo . Évalué à 1.
vous preferez faire ca que de mettre des slash mais ya encore mieux un nom de fichiers comportant des espaces il suffit de le mettre entre guillemet non ???
# sans utiliser ls !
Posté par NemTec . Évalué à 1.
for i in *; { echo "-> $i"; }
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.