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

renommage en série sous bash

16 réponses
Avatar
chmod 777
Bonjour à tous

J'ai dans un script bash une variable $i de la forme: artiste_-_titre.ogg
Je veux obtenir une forme: titre.mp3

avec ${i#_-_} j'obtiens: titre.ogg
avec ${i%ogg}mp3 j'obtiens: artiste_-_titre.mp3

Je n'arrive pas à combiner les 2 sans passer par une variable intermédiaire
et je ne trouve pas de solution dans les docs que j'ai sur bash.

Quelqu'un aurait une idée?


Lionel


PS: on m'a offert un autoradio mp3 qui ne lit pas les ogg (d'ou le besoin de
conversion) et dont l'affichage est limité à 32 caractères (d'où le besoin
de raccourcir les noms de fichiers).

10 réponses

1 2
Avatar
Nicolas George
chmod 777 wrote in message :
avec ${i#_-_} j'obtiens: titre.ogg


Hum, ce ne serait pas plutôt « ${i#*_-_} » ?

avec ${i%ogg}mp3 j'obtiens: artiste_-_titre.mp3

Je n'arrive pas à combiner les 2 sans passer par une variable intermédiaire
et je ne trouve pas de solution dans les docs que j'ai sur bash.


${${i#*_-_}%ogg}mp3

Mais passer par une variable intermédiaire est moins risqué au niveau des
erreurs de saisie. Et puis le syntax-highlight de Vim a des problèmes dès
qu'on dépasse un niveau :(

Avatar
TiChou
Dans le message <news:cl8hp8$t70$,
*Nicolas George* tapota sur f.c.o.l.configuration :

chmod 777 wrote:
avec ${i#_-_} j'obtiens: titre.ogg
Hum, ce ne serait pas plutôt « ${i#*_-_} » ?


avec ${i%ogg}mp3 j'obtiens: artiste_-_titre.mp3

Je n'arrive pas à combiner les 2 sans passer par une variable
intermédiaire et je ne trouve pas de solution dans les docs que j'ai sur
bash.


${${i#*_-_}%ogg}mp3


Cette syntaxe de substitution fonctionne avec le shell zsh, mais pas avec le
shell bash.

Mais passer par une variable intermédiaire est moins risqué au niveau des
erreurs de saisie.


Oui. :)

--
TiChou


Avatar
Nicolas George
"TiChou" wrote in message :
${${i#*_-_}%ogg}mp3
Cette syntaxe de substitution fonctionne avec le shell zsh, mais pas avec le

shell bash.


Ah oui, tiens. Au temps pour moi, j'étais persuadé que c'était aussi
standard que les ${foo<machin>bar} eux-mêmes.


Avatar
chmod 777
Nicolas George wrote:

"TiChou" wrote in message :
${${i#*_-_}%ogg}mp3
Cette syntaxe de substitution fonctionne avec le shell zsh, mais pas avec

le shell bash.


Ah oui, tiens. Au temps pour moi, j'étais persuadé que c'était aussi
standard que les ${foo<machin>bar} eux-mêmes.



Et bien merci à vous...

Effectivement, j'avais oublié un petit "#" dans mon post initial.

Bon, pas de soluce à moins de changer de shell et comme ça tourne comme ça,
au diable l'élégance! (j'ai déjà fait pire)

Lionel



Avatar
Christophe PEREZ
Le Thu, 21 Oct 2004 14:40:41 +0000, Nicolas George a écrit:

${${i#*_-_}%ogg}mp3

Mais passer par une variable intermédiaire est moins risqué au niveau des
erreurs de saisie. Et puis le syntax-highlight de Vim a des problèmes dès
qu'on dépasse un niveau :(


Il n'y a pas que lui, je n'ai jamais réussi quoi que ce soit avec cette
syntaxe en bash, "bad substitution" systématique :
$ S=coucou
$ RES1=${S#cou}
$ RES2=${RES1#c}
$ echo $S $RES1 $RES2
coucou cou ou
$ RES3=${${S#cou}#c}
bash: ${${S#cou}#c}: bad substitution

--
Christophe PEREZ
Écrivez moi sans _faute !

Avatar
Christophe PEREZ
Le Thu, 21 Oct 2004 17:27:48 +0200, TiChou a écrit:

Cette syntaxe de substitution fonctionne avec le shell zsh, mais pas avec le
shell bash.


J'ai posté avant d'avoir lu, donc on ne _répond_ pas à mon autre post ;-)
(Non, pas de cancel, sinon mon pan/inn se prend le pied dans le tapis,
désolé)

--
Christophe PEREZ
Écrivez moi sans _faute !

Avatar
no_spam
On Thu, 21 Oct 2004 14:33:29 -0400, Christophe PEREZ wrote:

Le Thu, 21 Oct 2004 14:40:41 +0000, Nicolas George a écrit:

${${i#*_-_}%ogg}mp3

Mais passer par une variable intermédiaire est moins risqué au niveau des
erreurs de saisie. Et puis le syntax-highlight de Vim a des problèmes dès
qu'on dépasse un niveau :(


Il n'y a pas que lui, je n'ai jamais réussi quoi que ce soit avec cette
syntaxe en bash, "bad substitution" systématique :
$ S=coucou
$ RES1=${S#cou}
$ RES2=${RES1#c}
$ echo $S $RES1 $RES2
coucou cou ou
$ RES3=${${S#cou}#c}
bash: ${${S#cou}#c}: bad substitution


En fait, il faut se servir de la fonction "eval" de bash. Un exemple
simple:
S="coucou" ;
T="S" ;
eval RES=${$T} ;
echo "RES=${RES}" ;


Avatar
Nicolas George
no_spam wrote in message :
En fait, il faut se servir de la fonction "eval" de bash. Un exemple
simple:
S="coucou" ;
T="S" ;
eval RES=${$T} ;
echo "RES=${RES}" ;


Tu n'as pas compris la question, il ne s'agit pas de faire une indirection
mais deux substitutions d'un coup.

Avatar
Christophe PEREZ
Le Thu, 21 Oct 2004 22:41:55 +0000, Nicolas George a écrit:

Tu n'as pas compris la question, il ne s'agit pas de faire une indirection
mais deux substitutions d'un coup.


Tout à fait, et sans passer par une variable intermédiaire, bien sûr ;-)

--
Christophe PEREZ
Écrivez moi sans _faute !

Avatar
Raphaël 'SurcouF' Bordet
chmod 777 wrote:
Bonjour à tous

J'ai dans un script bash une variable $i de la forme: artiste_-_titre.ogg
Je veux obtenir une forme: titre.mp3

avec ${i#_-_} j'obtiens: titre.ogg
avec ${i%ogg}mp3 j'obtiens: artiste_-_titre.mp3

Je n'arrive pas à combiner les 2 sans passer par une variable intermédiaire
et je ne trouve pas de solution dans les docs que j'ai sur bash.

Quelqu'un aurait une idée?


Il existe normalement une commande miraculeuse nommée "rename" qui
permet justement, via une regexp bien sentie, de faire des lots de
changements de noms...

$ replace 's/([a-z]+)_-_([a-z]+).ogg/$2.mp3/' *.mp3
(par exemple, je crois)

--
Raphaël 'SurcouF' Bordet
http://debianfr.net/ | surcouf at debianfr dot net

1 2