Forum Astuces.divers [Terminal] Manipulation des noms de fichiers comportant des espaces.

Posté par  .
Étiquettes : aucune
0
16
mai
2005
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  . Évalué à 1.

    La bonne manière de faire, dans ce cas précis, est plutôt :

    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  . Évalué à 1.

      Trop cool. Comme quoi on va souvent chercher compliqué là où c'est simple. Merci.
    • [^] # Re: Utiliser while

      Posté par  . Évalué à 1.

      \ls à la place de ls .... ça évite les problèmes lorsque qu'il y a un alias sur ls --color par exemple. (on évite de se choper les caractères spéciaux et qui peuvent poser problèmes par la suite ...)
    • [^] # Re: Utiliser while

      Posté par  . Évalué à 2.

      je serais assez tenté d'être d'accord avec toi, mais la réponse
      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  . Évalué à 1.

    je n'ai rien compris a cette astuce car je ne m'y connais pas trop
    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  . Évalué à 1.

    Voici une alternative toute simple:

    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.