[bash] problème des espaces dans les noms

Résolu
tlep Messages postés 597 Statut Membre -  
 nitneuc -
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. tlep Messages postés 597 Statut Membre 118
     
    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
    4
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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 {} \;
    2
  3. tlep Messages postés 597 Statut Membre 118
     
    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
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    1. tlep Messages postés 597 Statut Membre 118
       
      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
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    En double-quotant ta variable :
    basename "$i"
    https://www.grymoire.com/Unix/Quote.html ;-))
    0
    1. tlep Messages postés 597 Statut Membre 118
       
      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 ?
      0
    2. tlep Messages postés 597 Statut Membre 118
       
      Sauf en jouant avec la variable globale IFS, mais je n'y arrive pas bien.
      0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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.
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    un peu crade mais ca marche

    ce n'est pas du tout crade :-))
    0
  9. Lolo
     
    Ça n'est pas mieux... ça empêche de mettre @ dans les noms de fichiers. La solution avec IFS est mieux.
    0
  10. tlep Messages postés 597 Statut Membre 118
     
    ah y'a mieux apparemment :

    for i in `find /home/thierry/ -iname "*.jpg"|sed s/" "/"@"/`; do echo `dirname $i|sed s/"@"/"\ "/`;done
    -1
  11. tlep Messages postés 597 Statut Membre 118
     
    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
    1. nitneuc
       
      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
      0