[bash] problème des espaces dans les noms

Résolu
Bonjour,

l'éternel problème des espaces dans les noms des variables en bash..

Je veux chercher des images ".jpg" , et afficher leur nom, puis leur chemin.
Mais le résultat est tronqué dès que le chemin ou le nom contient un espace !

for i in `find ~/Desktop/ -iname "*.jpg"`;do echo "NOM: `basename $i` -> CHEMIN : ${i%/*.[jJ][pP][gG]}/";done|more

Comment contourner cet éternel problème ?

Merci !

Thierry
Configuration: Linux Debian
Firefox 1.0.4

10 réponses

  1. Bon, g trouve (un peu crade mais ca marche) en changeant IFS:

    IFS=$'\n' && for i in $(find /home/thierry/ -iname '*.jpg');do echo "`dirname $i`" && echo "`basename $i`";done
    1. Modérateur
      Salut,

      et si tu fait

      Je veux chercher des images ".jpg" , et afficher leur nom,
      find /chemin/vers/photos -iname '*.jpg' -exec basename {} \;
      puis leur chemin.
      find /chemin/vers/photos -iname '*.jpg' -exec dirname {} \;
      1. Ah ben merci, je ne connaissais pas "dirname".

        En revanche, si je veux passer le dirname en variable, j'ai toujours le meme problème de tronquage dès qu'il y a un espace dans un nom de répertoire.

        for i in `find /home/ihmcrm/ -iname "*.jpg"`;do echo dirname "$i";done|more

        Quid ?
        1. Modérateur
          Salut,

          j'espère que tu as compris pourquoi ça ne marche pas :-)

          quand on fait for i in $(find ....) , si les noms de fichiers ont des espaces (par exemple j'ai 2 fichiers a a.jpg et b c d.jpg) en fait ça reviens à
          for i in a a.jpg b c d.jpg 
          et pas à ce que tu veux
          for i in 'a a.jpg' 'b c d.jpg'
          1. Ben pour etre franc je ne comprends pas trop, et surtout j'aimerais bien savoir comment résoudre ce problème, pour pouvoir utiliser mes chemins et fichiers en variables lol
        2. Modérateur
          Salut,

          En double-quotant ta variable :
          basename "$i"
          https://www.grymoire.com/Unix/Quote.html ;-))
          1. Bin non!!
            Le problème des espaces se pose aussi dans le chemin, et les doubles-quotes ne fonctionnent pas, avec ou sans guillemets:

            for i in `find ~/Desktop/ -iname "*.jpg"`;do echo "${i%/*.[jJ][pP][gG]}/";done|more

            A moins que je ne positionne pas les double-quotes là où il faut ?
          2. Sauf en jouant avec la variable globale IFS, mais je n'y arrive pas bien.
        3. Modérateur
          Ben pour etre franc je ne comprends pas trop,

          Pour comprendre

          for i in a a.jpg b c d.jpg

          ici il lit 5 éléments
          a
          a.jpg
          b
          c
          d.jpg

          (vu que l'espace c'est le séparateur de la liste

          au lieu

          de 2 éléments a a.jpg et b c d.jpg

          Pour la solution, j'ai une idée mais en Perl.
          1. Modérateur
            un peu crade mais ca marche

            ce n'est pas du tout crade :-))
            1. Ça n'est pas mieux... ça empêche de mettre @ dans les noms de fichiers. La solution avec IFS est mieux.
              1. ah y'a mieux apparemment :

                for i in `find /home/thierry/ -iname "*.jpg"|sed s/" "/"@"/`; do echo `dirname $i|sed s/"@"/"\ "/`;done
                1. Le problème étant que je ne peux pas écrire dans le répertoire qui contient un espace, j'ai modifié comme suit:

                  for i in `find /home/thierry/ -iname "*.jpg"|sed s/" "/"@"/`;
                  do
                  chemin=`dirname $i|sed s/"@"/"\ "/`
                  && echo $chemin
                  && touch "${chemin}/"coucou.txt;
                  done

                  Voili voila, je pense que ca pourra servir à d'autres ;-)
                  1. J'ajouterai qu'il faut indiquer /g à sed pour qu'il remplace tous les espaces de la chaîne de caractères:

                    sed s/" "/"@"/g
                    sed s/"@"/"\ "/g