[bash] problème des espaces dans les noms
Résolu
tlep
Messages postés
596
Date d'inscription
Statut
Membre
Dernière intervention
-
nitneuc -
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
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
A voir également:
- [bash] problème des espaces dans les noms
- Espaces insécables - Guide
- Les noms des animaux - Télécharger - Études & Formations
- Bingo bash - Télécharger - Divers Jeux
- Tapez cette phrase, en respectant bien les espaces et la ponctuation. - Guide
- Samira a modifié le menu du jour que juliette lui avait envoyé. retrouvez les modifications proposées par samira : acceptez celles concernant les entrées, refusez celles concernant les plats et les desserts. combien de caractères (en incluant les espaces) contient la version finale du menu ? - Forum Matériel & Système
10 réponses
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
IFS=$'\n' && for i in $(find /home/thierry/ -iname '*.jpg');do echo "`dirname $i`" && echo "`basename $i`";done
Salut,
et si tu fait
Je veux chercher des images ".jpg" , et afficher leur nom,
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 {} \;
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 ?
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 ?
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 à
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.jpget pas à ce que tu veux
for i in 'a a.jpg' 'b c d.jpg'
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
En double-quotant ta variable :
En double-quotant ta variable :
basename "$i"https://www.grymoire.com/Unix/Quote.html ;-))
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.
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.
Ça n'est pas mieux... ça empêche de mettre @ dans les noms de fichiers. La solution avec IFS est mieux.
ah y'a mieux apparemment :
for i in `find /home/thierry/ -iname "*.jpg"|sed s/" "/"@"/`; do echo `dirname $i|sed s/"@"/"\ "/`;done
for i in `find /home/thierry/ -iname "*.jpg"|sed s/" "/"@"/`; do echo `dirname $i|sed s/"@"/"\ "/`;done
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 ;-)
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 ;-)