Re,
Le 08/12/2012 15:52, Frédéric a écrit :
> On samedi 08 décembre 2012, Olivier Allard-Jacquin wrote:
>
>> Bizarre, chez moi cela marche :
>> $ touch "tt/04-titre (2)"
>> $ find tt/ -type f|sort|sed -e 's|\(.*\)/\([0-9]\+\)-\([^/]*\)$|mv
>> "\1/\2-\3" "\1/\2. \3"|g'
>> mv "tt/01-titre1" "tt/01. titre1"
>> mv "tt/02-titre1" "tt/02. titre1"
>> mv "tt/03-titre 1" "tt/03. titre 1"
>> mv "tt/04-titre (2)" "tt/04. titre (2)"
>> $ mv "tt/04-titre (2)" "tt/04. titre (2)"
>> $ find tt/
>> tt/
>> tt/04. titre (2) <<<<<<<<<<
>> tt/03-titre 1
>> tt/02-titre1
>> tt/01-titre1
>>
>> Tu utilises quoi comme shell ? Ici, c'est du bash.
>
> bash aussi. Mais en fait, j'ai dit une bétise, c'est sur les ' (apostrophes) qu'il coince.
Tu es sur d'avoir copier-coller mon code, et de ne pas avoir remplacer
les ' dans le "sed -e" ? Car chez moi ca marche:
$ touch "tt/05-titre's bar"
$ find tt/ -type f|sort|sed -e 's|\(.*\)/\([0-9]\+\)-\([^/]*\)$|mv
"\1/\2-\3" "\1/\2. \3"|g'
mv "tt/01-titre1" "tt/01. titre1"
mv "tt/02-titre1" "tt/02. titre1"
mv "tt/03-titre 1" "tt/03. titre 1"
mv "tt/04-titre (2)" "tt/04. titre (2)"
tt/04. titre (2)
mv "tt/05-titre's bar" "tt/05. titre's bar"
$ mv "tt/05-titre's bar" "tt/05. titre's bar"
$
Envoies-moi un exemple de nom de fichier qui ne passe pas. C'est
peut-être un problème d'UTF-8, de caractère accentué, ou d'autre truc du
genre.
> Autre truc : lorsqu'il ne trouve pas le pattern, il sort quand même le nom du fichier ; c'est
> possible de ne pas le sortir ?
Mauvaise définition du cahier des charges, il n'était pas question de
fichiers qui ne correspondaient pas au modèle ! :)
Oui, c'est facile, il suffit de commencer par mettre un filtre sur le
modèle du fichier :
$ find tt/ -type f|sort|sed -e '/\/\([0-9]\+\)-\([^\/]*\)$/!d' -e
's|\(.*\)/\([0-9]\+\)-\([^/]*\)$|mv "\1/\2-\3" "\1/\2. \3"|g'
mv "tt/06-titre 6" "tt/06. titre 6"
Ici, les autres fichiers du répertoire "tt/", qui ont été précédemment
renommées, n'apparaissent plus, car il ne correspondent plus au modèle.
Note que entre les deux expressions de sed :
-e '/\/\([0-9]\+\)-\([^\/]*\)$/!d'
-e 's|\(.*\)/\([0-9]\+\)-\([^/]*\)$|mv "\1/\2-\3" "\1/\2. \3"|g'
j'ai dû backslasher les '/' dans la 1ère ligne.
En effet l'astuce du '|' dans la ligne de remplacement 's|toto|titi|g'
n'est pas réutilisable dans celle du -e '/grep_emulation/!d'
Cordialement,
Olivier
--
~~~~~~~ _____/\_____ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Phoenix / _ \/ _ \ Olivier Allard-Jacquin
/ / \ / \ \ Web: http://olivieraj.free.fr/
/___/ / \ \___\ Mail: olivieraj@???
~~~~ ///// ///\\\ \\\\\ ~~~~~~~~~~~~~~~~~~~~~~~ Linux Powered !!