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
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
[...]
Avec zsh:
autoload -U zmv
zmv 'photo(<->).png' 'photo${(l:3::0:)1}.png'
--
Stephane
Le 30/01/2012 18:28, Stephane Chazelas m'a répondu :
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
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
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.
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.
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 !
À 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
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
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 :)