[bash] problème des espaces dans les noms

Résolu
tlep Messages postés 596 Date d'inscription   Statut Membre Dernière intervention   -  
 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

10 réponses

tlep Messages postés 596 Date d'inscription   Statut Membre Dernière intervention   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
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
tlep Messages postés 596 Date d'inscription   Statut Membre Dernière intervention   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
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
tlep Messages postés 596 Date d'inscription   Statut Membre Dernière intervention   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

Vous n’avez pas trouvé la réponse que vous recherchez ?

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

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

ce n'est pas du tout crade :-))
0
Lolo
 
Ça n'est pas mieux... ça empêche de mettre @ dans les noms de fichiers. La solution avec IFS est mieux.
0
tlep Messages postés 596 Date d'inscription   Statut Membre Dernière intervention   118
 
ah y'a mieux apparemment :

for i in `find /home/thierry/ -iname "*.jpg"|sed s/" "/"@"/`; do echo `dirname $i|sed s/"@"/"\ "/`;done
-1
tlep Messages postés 596 Date d'inscription   Statut Membre Dernière intervention   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
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