[bash] problème des espaces dans les noms

Résolu/Fermé
tlep Messages postés 596 Date d'inscription jeudi 21 février 2002 Statut Membre Dernière intervention 25 octobre 2012 - 16 janv. 2007 à 19:07
 nitneuc - 7 mai 2014 à 14:29
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 jeudi 21 février 2002 Statut Membre Dernière intervention 25 octobre 2012 118
17 janv. 2007 à 11:20
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
16 janv. 2007 à 23:48
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 jeudi 21 février 2002 Statut Membre Dernière intervention 25 octobre 2012 118
17 janv. 2007 à 09:54
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
17 janv. 2007 à 10:44
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 jeudi 21 février 2002 Statut Membre Dernière intervention 25 octobre 2012 118
17 janv. 2007 à 11:07
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
16 janv. 2007 à 19:24
Salut,

En double-quotant ta variable :
basename "$i"
https://www.grymoire.com/Unix/Quote.html ;-))
0
tlep Messages postés 596 Date d'inscription jeudi 21 février 2002 Statut Membre Dernière intervention 25 octobre 2012 118
16 janv. 2007 à 22:34
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 jeudi 21 février 2002 Statut Membre Dernière intervention 25 octobre 2012 118
16 janv. 2007 à 23:15
Sauf en jouant avec la variable globale IFS, mais je n'y arrive pas bien.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
17 janv. 2007 à 11:11
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
17 janv. 2007 à 11:35
un peu crade mais ca marche

ce n'est pas du tout crade :-))
0
Ç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 jeudi 21 février 2002 Statut Membre Dernière intervention 25 octobre 2012 118
17 janv. 2007 à 16:07
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 jeudi 21 février 2002 Statut Membre Dernière intervention 25 octobre 2012 118
17 janv. 2007 à 16:36
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
0