bash et espaces dans les noms de fichiers

Le
Bruno
Bonjour à tous,

Je fais parfois des petits scripts utilitaires pour effectuer des travaux
trop longs à faire à la main

Mais quand il s'agit de manipuler des fichiers dont les noms comprennent
des espaces, ça coince. Par exemple :

for file in *.mp3
do mp3gain -r $file
done

ne marche pas car $file ne contient pas le nom complet du fichier, mais
seulement le début jusqu'au premier espace. Le fichier est donc
inaccessible pour le processus invoqué

Vous allez me dire qu'il serait préférable de remplacer les espaces par
des sous-lignes (_), mais il faudrait que j'écrive un script pour faire ça
sur tous mes fichiers. ;-)
Bon, je l'ai envisagé mais c'est le plan B.

Pour le plan A, je préférerais une autre solution si vous en avez une à
me proposer

Merci.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Sebastien Doucet
Le #1883692
On 2007-04-14, Bruno

Bonjour à tous,

Je fais parfois des petits scripts utilitaires pour effectuer des travaux
trop longs à faire à la main...

Mais quand il s'agit de manipuler des fichiers dont les noms comprennent
des espaces, ça coince. Par exemple :

for file in *.mp3
do mp3gain -r $file
done

... ne marche pas car $file ne contient pas le nom complet du fichier, mais
seulement le début jusqu'au premier espace. Le fichier est donc
inaccessible pour le processus invoqué...

Vous allez me dire qu'il serait préférable de remplacer les espaces par
des sous-lignes (_), mais il faudrait que j'écrive un script pour faire ça
sur tous mes fichiers. ;-)
Bon, je l'ai envisagé mais c'est le plan B.

Pour le plan A, je préférerais une autre solution si vous en avez une à
me proposer...

Merci.


salut


test avec
do mp3gain -r "$file"

ça devrait marcher

seb

Nicolas George
Le #1883690
Bruno wrote in message
for file in *.mp3
do mp3gain -r $file
done

... ne marche pas car $file ne contient pas le nom complet du fichier, mais
seulement le début jusqu'au premier espace. Le fichier est donc
inaccessible pour le processus invoqué...


Comme on te l'a dit, il faudrait écrire "$file", et c'est vrai partout, sauf
si tu sais exactement ce que tu fais.

Vous allez me dire qu'il serait préférable de remplacer les espaces par
des sous-lignes (_)


Ce serait préférable de toutes façons.

Bruno
Le #1883689
Sebastien Doucet wrote:

salut


Salut.


test avec
do mp3gain -r "$file"

ça devrait marcher

seb


Non, malheureusement, le résultat est le même.

Pour un fichier style : "Nom avec des espaces.mp3", le script sort :
can't open Nom
can't open avec
can't open des
can't open espaces.mp3


Et si je saisis dans la console : mp3gain Nom
puis que je presse [tab], j'obtiens : mp3gain Nom avec des espaces.mp3


Des espaces dans les noms des fichiers, c'est pas bô...

Luc.Habert.00__arjf
Le #1883688
Bruno :

Pour un fichier style : "Nom avec des espaces.mp3", le script sort :
can't open Nom
can't open avec
can't open des
can't open espaces.mp3


Euh, ça serait pas ton programme « mp3gain » qui serait lui aussi un script
qui oublie de quoter?

Bruno
Le #1883687
Luc Habert wrote:


Euh, ça serait pas ton programme « mp3gain » qui serait lui aussi un
script qui oublie de quoter?


Non, non. Quel que soit le programme invoqué de cette façon, le problème
est le même. C'est le bash, apparemment, qui n'aime pas les espaces dans
les noms...

Mais de toutes façons :
Les espaces dans les noms de fichiers, c'est pas bô.

Je sais pas pourquoi, mais c'est comme ça. Pourtant, ce n'est qu'un
caractère comme un autre... Les raisons du problème sont peut-être
historiques...

Voilà un sujet de digression intéressant.

Nicolas George
Le #1883686
Bruno wrote in message
Non, non. Quel que soit le programme invoqué de cette façon, le problème
est le même. C'est le bash, apparemment, qui n'aime pas les espaces dans
les noms...


C'est faux. Le problème est de ton côté.

Stéphan Peccini
Le #1883685

Sebastien Doucet wrote:


test avec
do mp3gain -r "$file"

ça devrait marcher

seb


Non, malheureusement, le résultat est le même.


Et pourtant :

En bourne shell

sh-3.1$ for i in *; do cat $i; done
cat: Essai: Aucun fichier ou répertoire de ce type
cat: de: Aucun fichier ou répertoire de ce type
cat: fichier: Aucun fichier ou répertoire de ce type

sh-3.1$ for i in *; do cat "$i"; done
sh-3.1$

et en bash

[ Essai]$ for i in *; do cat $i; done
cat: Essai: Aucun fichier ou répertoire de ce type
cat: de: Aucun fichier ou répertoire de ce type
cat: fichier: Aucun fichier ou répertoire de ce type

[ Essai]$ for i in *; do cat "$i"; done
[ Essai]$

[ Essai]$ ls -l
total 0
-rw-rw-r-- 1 spc spc 0 avr 14 21:58 Essai de fichier
-rw-rw-r-- 1 spc spc 0 avr 14 21:58 toto

--
Stéphan Peccini


Bruno
Le #1883684
Nicolas George wrote:

C'est le bash, apparemment, qui n'aime pas les espaces
dans les noms...


C'est faux. Le problème est de ton côté.


C'est résolvable alors, bonne nouvelle.

Comment expliques-tu que sous batch, le fichier "Nom avec des espaces.mp3"
soit : "Nom avec des espaces.mp3" ?

Un problème de config ?


Bruno
Le #1883683
Désolé de vous avoir pris la tête, vous aviez raison.
Ça marche.

Je ne sais pas ce qui s'est passé, j'ai dû merder quelque part lors de
l'essai...

Toutes mes plus plates excuses.

Je m'en vais changer de pseudo, de nom, de tête...

Et merci de votre patience.
Th.A.C
Le #1883682


Comment expliques-tu que sous batch, le fichier "Nom avec des espaces.mp3"
soit : "Nom avec des espaces.mp3" ?

Un problème de config ?


Heu, c'est tout a fait normal.
Le shell bash (quand on appuye sur TAB) affiche un nom de fichier entier
et fait précéder chaque caractère pouvant être interprété autrement par
un . Comme le shell ne vérifie pas si tu as tapé des guillemets ou des
apostrophes, il met systématiquement les .
Ca peut permettre par exemple d'utiliser des noms de fichiers contenant
les caractères spéciaux comme * ? / (et les autres).

Pour éviter les problèmes avec ces caractères spéciaux, il vaut mieux
utiliser l'apostrophe, le guillemet n'empêche pas le shell bash
d'interpréter certains caractères dans une chaine:
http://abs.traduc.org/abs-4.2.01-fr/ch05.html

il faudrait quand même vérifier si le programme mp3gain prend bien les
noms avec des espaces comme un seul argument s'il y a des guillemets ou
des apostrophes en tapant la commande 'à la mimine':
mp3gain 'nom de fichier.mp3'
ou
mp3gain "nom de fichier.mp3"

Publicité
Poster une réponse
Anonyme