OVH Cloud OVH Cloud

Shell : renommer des fichiers avec numéros

Aucune réponse
Avatar
Olivier Miakinen
Bonjour,

Soit un répertoire comportant des fichiers nommés par exemple
photo7.png, photo13.png, photo239.png ou photo3535.png.

Je voudrais renommer les fichiers dont le numéro est inférieur
à 100 afin que ce numéro soit représenté sur trois chiffres :
photo007.png et photo013.png. Je sais le faire en générant un
script (grâce à vim) contenant tous les « mv » qui vont bien,
mais je suis sûr que ça doit pouvoir se faire en une ligne de
shell (ou peut-être deux, une pour les nombres à un chiffre
et une pour les nombres à deux chiffres).

Quelqu'un saurait me dire comment faire ?

Note : par défaut j'utilise bash, mais si c'est plus simple je
peux lancer un autre shell.

Cordialement,
--
Olivier Miakinen

7 réponses

1 2 3
Avatar
nshag
On 13 fév, 12:25, Antoine Leca wrote:
écrivit :

> sed -n 'h;s/[0-9][0-9]/0/;t out;s/[0-9]/00/;: out;H;g;s/(.*)n/mv 1 /p'

Ceci utilise un certain nombre d'extensions GNU, n'est-ce pas ?
( ; qui n'appartient pas à une étiquette, synonyme de &)



pour la backref oui elle est absente des BRE, le semicolon devenant
separateur lorsqu'il precede une commande est par contre POSIX.
Avatar
Hugues
Ce cher Olivier Miakinen <om+ a posté :

Le 31/01/2012 11:11, Cyrille Lefevre a écrit :

[...]



Juste histoire de chipoter quand même, pour l'exemple demandé il
m'aurait fallu faire deux corrections à ton script :
- remplacer « jpg » par « png »



:%s/.jpg/.png/gc

- supprimer la ligne « (( j < 1000 )) && k=0$k » (elle fait des nombres
à quatre chiffres et non à trois chiffres).



/1000<ESC>dd

Merci en tout cas !



;)

:wq

--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
Avatar
Antoine Leca
nshag écrivit :
On 13 fév, 12:25, Antoine Leca wrote:
écrivit :

sed -n 'h;s/[0-9][0-9]/0/;t out;s/[0-9]/00/;: out;H;g;s/(.*)n/mv 1 /p'



Ceci utilise un certain nombre d'extensions GNU, n'est-ce pas ?
( ; qui n'appartient pas à une étiquette, synonyme de &)



pour la backref oui elle est absente des BRE, le semicolon devenant
separateur lorsqu'il precede une commande est par contre POSIX.



... sauf lorsqu'il suit {, a, b, c, i, r, t, w, : ou #

Et les sed(1) actuels de FreeBSD, NetBSD, ucbcmd ou Interix/SUA, par
exemple, n'implémentent pas cette extension pour :, b et t ; OpenBSD de
son côté l'a incorporé « comme d'autres sed font » en octobre 2003,
http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/sed/compile.c#rev1.16


Antoine
Avatar
nshag
On 14 fév, 08:49, Antoine Leca wrote:
> pour la backref oui elle est absente des BRE, le semicolon devenant
> separateur lorsqu'il precede une commande est par contre POSIX.

... sauf lorsqu'il suit {, a, b, c, i, r, t, w, : ou #



et pour cause elles attendent toutes des
arguments et/ou sont terminales, hors lorsqu'il
précède la commande suivante le semicolon
se retrouve après l'argument s'il y a lieu et
non après le command verb, il reprend
ainsi son rôle habituel. Ce n'est pas une
"extension GNU", :; est de toute façon d'un
intérêt très limité et les labels undefined.

ceci dit rien n’empêche de composer le
oneliner a grand coup de -e multiples mais
j'intervenais dans le contexte pour le moins
GNU (bash) de la question originale et sur
l'utilisation de multiples instances et non de
multiples commandes "passées à"/de sed :)
Avatar
Antoine Leca
nshag écrivit :
ceci dit rien n’empêche de composer le
oneliner a grand coup de -e multiples mais
j'intervenais dans le contexte pour le moins
GNU (bash) de la question originale et sur
l'utilisation de multiples instances et non de
multiples commandes "passées à"/de sed :)



Oh, aucun problème pour moi ; je voulais juste attirer l'attention
d'éventuelles passants sur le fait que ton joli script pouvait mal
fonctionner sur certaines machines (comme la mienne en fait)


Antoine
Avatar
Cyrille Lefevre
Le 14/02/2012 09:49, Antoine Leca a écrit :
nshag écrivit :
On 13 fév, 12:25, Antoine Leca wrote:
écrivit :

sed -n 'h;s/[0-9][0-9]/0/;t out;s/[0-9]/00/;: out;H;g;s/(.*)n /mv 1 /p'



Ceci utilise un certain nombre d'extensions GNU, n'est-ce pas ?
( ; qui n'appartient pas à une étiquette, synonyme de&)



pour la backref oui elle est absente des BRE, le semicolon devenant
separateur lorsqu'il precede une commande est par contre POSIX.



... sauf lorsqu'il suit {, a, b, c, i, r, t, w, : ou #

Et les sed(1) actuels de FreeBSD, NetBSD, ucbcmd ou Interix/SUA, par
exemple, n'implémentent pas cette extension pour :, b et t ; OpenBSD de
son côté l'a incorporé « comme d'autres sed font » en octobre 2003,
http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/sed/compile.c#rev1.16




Bonjour,

juste 2 patches de 2002 !

http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/41159
[patch] new sed(1) -c option to allow ; as a separator for b, t and :
functions

http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/41190
[patch] sed(1) report the { linenum instead of EOF linenum on pending }

10 ans et toujours pas commité, pas mal...

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
meta
La commande à utiliser pour les numéros à 1 chiffre (à adapter pour les
numéros à 2 chiffres) serait:

sed -e "s/photo([0-7]).png/photo001.png"

Je n'ai pas le temps de vous écrire la totale mais c'est l'idée. C'est ce
que vous avez du faire sous vim de toutes façons ?


"Olivier Miakinen" a écrit dans le message de groupe de discussion :
jg6bp2$1bp3$

Bonjour,

Soit un répertoire comportant des fichiers nommés par exemple
photo7.png, photo13.png, photo239.png ou photo3535.png.

Je voudrais renommer les fichiers dont le numéro est inférieur
à 100 afin que ce numéro soit représenté sur trois chiffres :
photo007.png et photo013.png. Je sais le faire en générant un
script (grâce à vim) contenant tous les « mv » qui vont bien,
mais je suis sûr que ça doit pouvoir se faire en une ligne de
shell (ou peut-être deux, une pour les nombres à un chiffre
et une pour les nombres à deux chiffres).

Quelqu'un saurait me dire comment faire ?

Note : par défaut j'utilise bash, mais si c'est plus simple je
peux lancer un autre shell.

Cordialement,
--
Olivier Miakinen
1 2 3