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

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

10 réponses

1 2 3
Avatar
Stephane Chazelas
2012-01-30 16:07:32 +0100, 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.


[...]

Avec zsh:

autoload -U zmv
zmv 'photo(<->).png' 'photo${(l:3::0:)1}.png'

--
Stephane
Avatar
Olivier Miakinen
Bonjour,

Le 30/01/2012 18:28, Stephane Chazelas m'a répondu :

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. [...]



Avec zsh:

autoload -U zmv
zmv 'photo(<->).png' 'photo${(l:3::0:)1}.png'



Merci de ta réponse, et de cette occasion que tu m'offres
de découvrir zsh. Je n'ai pas encore bien compris comment
fonctionne autoload (j'ai juste vu qu'avant ça, zmv n'est
pas connu, et qu'après c'est une 'shell function'), ni la
syntaxe des options de zmv.

J'ai quand même trouvé la doc de zmv dans 'man zshcontrib',
et je l'ai lancé avec l'option -n. Bien m'en a pris, car
j'ai vu que les nombres à 4 chiffres seraient tronqués à
trois (photo3535.png -> photo535.png).

Quoi qu'il en soit, je vais continuer à chercher par moi-même,
mais si je pouvais avoir une explication des deux commandes
ci-dessus ça me ferait plaisir !

Cordialement,
--
Olivier Miakinen
Avatar
Lucas Levrel
Le 30 janvier 2012, Olivier Miakinen a écrit :
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.



Bonjour,

Indépendamment du shell, tu peux utiliser mmv :
mmv 'photo[0-9].*' 'photo00#1.#2'
mmv 'photo[0-9][0-9].*' 'photo0#1.#2'

--
LL
Avatar
Alain Ketterlin
Olivier Miakinen <om+ writes:

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 ch iffres :
photo007.png et photo013.png. Je sais le faire en générant un
script (grâce à vim) contenant tous les « mv » qui vo nt 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).



Hors les solutions subtiles proposées ici, j'imagine que ce que tu fais
en vim est transposable en sed (ou autre), dont tu peux piper le
résultat à bash, non ?

-- Alain.
Avatar
Cyrille Lefevre
Le 30/01/2012 16:07, Olivier Miakinen a écrit :
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érieu r
à 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 ?



surement !

Bonjour,

for i in photo*.jpg; do
# on vire le suffixe
j=${i%.jpg}
# on vire le prefix
j=${j#photo}
# on vire les 0 pour éviter l’interprétation en octal
j=${j#0}
j=${j#0}
# pour les valeurs > 1000
# j=${j#0}
# dés fois qu'il n'y ai plus rien
j=${j:-0}
# j pour les comparaisons et
# k avec les 0
k=$j
# ajout dunb de zéro nécessaire
(( j < 10 )) && k=0$k
(( j < 100 )) && k=0$k
(( j < 1000 )) && k=0$k
# la cible existe-t-elle ?
[[ -f "photo$k.jpg" ]] ||
# non, no renomme
mv "$i" "photo$k.jpg"
done

en voila
Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
remove "%nospam" and ".invalid" to answer me.
Avatar
Stephane Le Men
On 01/30/2012 04:07 PM, Olivier Miakinen wrote:
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 ?





for i in {1..99}
do
printf "mv photo%d.png photo%.3d.pngn" $i $i
done | sh

Mon nez me dit qu'il existe plus court, plus sûr, mais ... il est
enrhumé. C'est l’hiver !
Avatar
Olivier Miakinen
Le 30/01/2012 16:07, je demandais :

Quelqu'un saurait me dire comment faire ?



À tous ceux qui m'ont répondu : je suis désolé de ne pas tester
pour le moment, mais je ne vous oublie pas ! Je reviendrai plus
tard répondre à chacun.

Cordialement,
--
Olivier Miakinen
Avatar
Alain Montfranc
Olivier Miakinen avait soumis l'idée :
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,



ls photo*.png | sed 's/photo(.*).png/1 001/' | sed 's/(.*)
.*(...)$/mv photo1.png photo2.png/' | sh

Ca fera juste une erreur sur les fichiers à 3 chiffres qu'on peut
eviter en faisant un grep -v '^... ' apres le 1er sed par exemple
Avatar
Alain Montfranc
Après mûre réflexion, Alain Montfranc a écrit :
Olivier Miakinen avait soumis l'idée :
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,



ls photo*.png | sed 's/photo(.*).png/1 001/' | sed 's/(.*)
.*(...)$/mv photo1.png photo2.png/' | sh

Ca fera juste une erreur sur les fichiers à 3 chiffres qu'on peut eviter en
faisant un grep -v '^... ' apres le 1er sed par exemple



En relisant ce message je vous que certains lecteurs de news
interpretent des caracteres pour mise en italique, etc...

idealement regarder le souce du message pour avoir la bonne syntaxe
Avatar
shagounet
Le jeudi 2 février 2012 20:23:46 UTC, Alain Montfranc a écrit :
ls photo*.png | sed 's/photo(.*).png/1 001/' | sed 's/(.*)
.*(...)$/mv photo1.png photo2.png/' | sh

Ca fera juste une erreur sur les fichiers à 3 chiffres qu'on peut
eviter en faisant un grep -v '^... ' apres le 1er sed par exemple



le shell et ls suffisent a isoler les fichiers contenants 1 ou 2 digits con sécutifs;
de meme que quitte a sortir sed, autant l'utiliser et une seule fois:
sed -n 'h;s/[0-9][0-9]/0/;t out;s/[0-9]/00/;: out;H;g;s/(.*)n/mv 1 /p'

un /[0-9]{3,}/d étant en option si on ne veut pas matcher avec le shell :)
1 2 3