[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. Ça n'est pas mieux... ça empêche de mettre @ dans les noms de fichiers. La solution avec IFS est mieux.
      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
      2. ah y'a mieux apparemment :

        for i in `find /home/thierry/ -iname "*.jpg"|sed s/" "/"@"/`; do echo `dirname $i|sed s/"@"/"\ "/`;done
        1. Modérateur
          un peu crade mais ca marche

          ce n'est pas du tout crade :-))
          1. 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
              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. 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,

                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. 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.