Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Noms de variables avec espaces

5 réponses
Avatar
Zakath
Bonjour,
je débute en scripting et j'aimerais automatiser des renommages de
fichiers (triple extension après passage de mppdec et lame).
J'ai une solution qui fonctionne bien avec sed mais un problème
lorsque les noms de fichiers comportent des espaces...

Voici ce que j'ai pour l'instant :

for i in *.mpc.wav;
do mv $i `ls $i | sed 's/\.mpc\.wav//'`;
done;

qui fonctionne parfaitement avec les noms de fichiers sans espaces.
En revanche, tout appel à cette fonction avec des fichiers du style
"01 Piste1.mpc.wav.mp3", j'ai un message d'erreur

mv: when moving multiple files, last argument must be a directory


Et même en mettant des print pour vérifier le résultat de chaque
étape, je ne vois pas à quel moment mv pourrait agir sur plus de
deux arguments...

Merci beaucoup d'éclairer ma lanterne.

Zakath

5 réponses

Avatar
JustMe
Zakath wrote:

Bonjour,
je débute en scripting et j'aimerais automatiser des renommages de
fichiers (triple extension après passage de mppdec et lame).
J'ai une solution qui fonctionne bien avec sed mais un problème
lorsque les noms de fichiers comportent des espaces...

Voici ce que j'ai pour l'instant :

for i in *.mpc.wav;
do mv $i `ls $i | sed 's/.mpc.wav//'`;
done;


par ex :

for i in *.mpc.wav;
do mv "$i" "`echo $i | sed 's/.mpc.wav//'`";
done;

par exemple


qui fonctionne parfaitement avec les noms de fichiers sans espaces.
En revanche, tout appel à cette fonction avec des fichiers du style
"01 Piste1.mpc.wav.mp3", j'ai un message d'erreur

mv: when moving multiple files, last argument must be a directory


Et même en mettant des print pour vérifier le résultat de chaque
étape, je ne vois pas à quel moment mv pourrait agir sur plus de
deux arguments...

Merci beaucoup d'éclairer ma lanterne.

Zakath


Avatar
Stephane Chazelas
2004-07-07, 17:30(+02), Zakath:
Bonjour,
je débute en scripting et j'aimerais automatiser des renommages de
fichiers (triple extension après passage de mppdec et lame).


Exemple d'interet de zsh:

zmv '(*).mpc.wav' '$1'

Qui fonctionne parfaitement quels que soient les noms des
fichiers.

(autoload -U zmv
si pas deja dans le ~/.zshrc)

--
Stephane

Avatar
Laurent Wacrenier
Zakath écrit:
Voici ce que j'ai pour l'instant :

for i in *.mpc.wav;
do mv $i `ls $i | sed 's/.mpc.wav//'`;


Ho que c'est moche.

mv "$i" "${i%.mpc.wav}"

done;

qui fonctionne parfaitement avec les noms de fichiers sans espaces.
En revanche, tout appel à cette fonction avec des fichiers du style
"01 Piste1.mpc.wav.mp3", j'ai un message d'erreur


Sans compter les répertoires.
Ne pas utiliser "ls" à tort et à travers.

Avatar
Stephane Chazelas
2004-07-07, 17:30(+02), Zakath:
[...]
for i in *.mpc.wav;


Exemples de bugs corrigés par zsh:

Ici, s'il n'y a pas de fichier *.mpc.wav, bash/ksh vont
parcourir la boucle avec un element "*.mpc.wav". zsh ne va rien
faire et reporter l'erreur.

do mv $i `ls $i | sed 's/.mpc.wav//'`;


Autre exemple de bug corrigé par zsh.

Pour bash/ksh, $i sans quote est decoupé en plusieurs arguments
suivant les espaces, et les wilcards sont "expanded". Pas dans
zsh.

Par contre dans zsh aussi le resultat d'une command subsitution
est decoupe (pas de wildcard expansion qui ne fait aucun sens
contrairement a bash/ksh par contre).

Ici, pour etre propre, avec bash/ksh, il faut faire

set x [*].mpc.wav *.mpc.wav
case $2$3 in
'[*].mpc.wav*.mpc.wav') echo >&2 "no .mpc.wav file"; false;;
*) for f
do mv -- "$f" "${f%.mpc.wav}"
done;;
esac

(pas testé).

Alors que l'equicalent zsh est:

for f (*.mpc.wav) mv -- $f ${f:r:r}

(pas testé non plus mais je suis plus confiant que ca va
marcher et pas besoin d'ecrire de script).

--
Stephane

Avatar
Zakath
Zakath wrote:
Bonjour,
je débute en scripting et j'aimerais automatiser
des renommages de

fichiers (triple extension après passage de
mppdec et lame).

J'ai une solution qui fonctionne bien avec sed
mais un problème

lorsque les noms de fichiers comportent des
espaces...


Voici ce que j'ai pour l'instant :

for i in *.mpc.wav;
do mv $i `ls $i | sed 's/.mpc.wav//'`;
done;

qui fonctionne parfaitement avec les noms de
fichiers sans espaces.

En revanche, tout appel à cette fonction avec
des fichiers du style

"01 Piste1.mpc.wav.mp3", j'ai un message d'erreur

mv: when moving multiple files, last argument
must be a directory



Et même en mettant des print pour vérifier le
résultat de chaque

étape, je ne vois pas à quel moment mv pourrait
agir sur plus de

deux arguments...

Merci beaucoup d'éclairer ma lanterne.

Zakath


Je réponds ici pour ne défavoriser aucune des
gentilles personnes qui m'ont répondu. J'utilise
déjà zsh, et zmv s'est parfaitement débrouillé. Je
vais essayer les autres solutions pas acquis de
conscience.

Merci beaucoup !