Shell : renommer des fichiers avec numéros

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Stephane Chazelas
Le #24207241
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
Olivier Miakinen
Le #24207391
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
Lucas Levrel
Le #24208661
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
Alain Ketterlin
Le #24208761
Olivier Miakinen
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.
Cyrille Lefevre
Le #24208891
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.
Stephane Le Men
Le #24209571
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 !
Olivier Miakinen
Le #24216181
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
Alain Montfranc
Le #24216301
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
Alain Montfranc
Le #24216861
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
shagounet
Le #24225821
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 :)
Publicité
Poster une réponse
Anonyme