Rechercher : dans
Par :

[bash] problème des espaces dans les noms

Dernière réponse le 16 oct 2007 à 10:55:01 tlep, le 16 jan 2007 à 19:07:33 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [bash] problème des espaces dans les noms » dans :
Libérer de l'espace sur la partition système VoirVotre disque dur comporte deux partitions, une pour le système et l'autre pour les données et vous constatez que la partition système est quasi pleine alors que l'autre a encore beaucoup d'espace libre. Vous pouvez bien sûr redimensionner vos...
Guide d'utilisation du Shell pour débutant VoirSHELL BASH - GUIDE D'UTILISATION - Niveau Débutant Introduction Appel aux membres CCM II. C'est quoi le shell ? III. Comment accéder à la ligne de commande IV. Les consoles virtuelles Exemple : Accéder à la console 3 depuis l'interface...
Espace en HTML VoirEn HTML, les espaces consécutifs sont ignorés par les navigateurs, au même titre que les retours chariots ou les tabulations. Pour insérer plusieurs espaces consécutifs, il est nécessaire d'utiliser une entité HTML spécifique, appelée espace...
Les espaces de nom XML VoirIntroduction aux espaces de noms XML définit un système permettant de créer des balises modulaires, c'est-à-dire pouvoir donner la possibilité d'utiliser des balises provenant de différents langages à balise au sein d'un même document grâce à la...

1

jipicy, le 16 jan 2007 à 19:24:35

Salut,

En double-quotant ta variable :

basename "$i"
http://www.grymoire.com/Unix/Quote.html ;-)) Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

2

tlep, le 16 jan 2007 à 22:34:45

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 ?

Répondre à tlep

3

tlep, le 16 jan 2007 à 23:15:22

Sauf en jouant avec la variable globale IFS, mais je n'y arrive pas bien.

Répondre à tlep

4

lami20j, le 16 jan 2007 à 23:48:16

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 {} \;
lami20j

Répondre à lami20j

5

tlep, le 17 jan 2007 à 09:54:16

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 ?

Répondre à tlep

6

lami20j, le 17 jan 2007 à 10:44:30

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'
lami20j

Répondre à lami20j

7

tlep, le 17 jan 2007 à 11:07:58

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

Répondre à tlep

8

lami20j, le 17 jan 2007 à 11:11:47

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

Répondre à lami20j

9

tlep, le 17 jan 2007 à 11:20:46

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

Répondre à tlep

10

lami20j, le 17 jan 2007 à 11:35:03

un peu crade mais ca marche

ce n'est pas du tout crade :-)) lami20j

Répondre à lami20j

11

tlep, le 17 jan 2007 à 16:07:32

Ah y'a mieux apparemment :

for i in `find /home/thierry/ -iname "*.jpg"|sed s/" "/"@"/`; do echo `dirname $i|sed s/"@"/"\ "/`;done

Répondre à tlep

12

tlep, le 17 jan 2007 à 16:36:41

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 ;-)

Répondre à tlep

13

 Lolo, le 16 oct 2007 à 10:55:01

Ça n'est pas mieux... ça empêche de mettre @ dans les noms de fichiers. La solution avec IFS est mieux.

Répondre à Lolo
Collection CommentÇaMarche.net