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.
Je continue ma lecture de vos réponses, en testant à chaque fois.
Le 31/01/2012 10:00, Lucas Levrel a écrit :
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).
Indépendamment du shell, tu peux utiliser mmv :
Je ne connaissais pas mmv, mais je viens de l'installer et de le tester. En effet, ça me semble répondre parfaitement à mon besoin.
Ok pour le premier, mais pour le second ce serait plutôt : mmv 'photo[0-9][0-9].*' 'photo0#1#2.#3'
On peut aussi le faire en une seule commande : mmv photo[0-9].* photo00#1.#2 photo[0-9][0-9].* photo0#1#2.#3 ^D
En tout cas, je te remercie pour l'idée !
-- Olivier Miakinen
Salut !
Je continue ma lecture de vos réponses, en testant à chaque fois.
Le 31/01/2012 10:00, Lucas Levrel a écrit :
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).
Indépendamment du shell, tu peux utiliser mmv :
Je ne connaissais pas mmv, mais je viens de l'installer et de le
tester. En effet, ça me semble répondre parfaitement à mon besoin.
Je continue ma lecture de vos réponses, en testant à chaque fois.
Le 31/01/2012 10:00, Lucas Levrel a écrit :
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).
Indépendamment du shell, tu peux utiliser mmv :
Je ne connaissais pas mmv, mais je viens de l'installer et de le tester. En effet, ça me semble répondre parfaitement à mon besoin.
Ok pour le premier, mais pour le second ce serait plutôt : mmv 'photo[0-9][0-9].*' 'photo0#1#2.#3'
On peut aussi le faire en une seule commande : mmv photo[0-9].* photo00#1.#2 photo[0-9][0-9].* photo0#1#2.#3 ^D
En tout cas, je te remercie pour l'idée !
-- Olivier Miakinen
Olivier Miakinen
Bonjour,
Le 31/01/2012 10:40, Alain Ketterlin a écrit :
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 ?
Certes, sauf qu'avec vim je n'ai pas besoin que mes actions soient parfaites dès le départ. En gros, je commence par mettre dans un fichier la liste des noms de fichiers à traiter, puis je peux faire un « :%s/.*/mv & &/ » avant de changer le nom de droite, ou bien je peux tenter de le faire du premier coup, bref j'ai toute latitude de me tromper jusqu'au moment où le fichier contient la liste des commandes 'mv' qui me convient, et que je peux lancer son exécution.
Le faire en une commande sed, awk, ou autre, serait bien sûr possible, mais me demanderait plus d'efforts pour être certain de ne pas me tromper.
Cordialement, -- Olivier Miakinen
Bonjour,
Le 31/01/2012 10:40, Alain Ketterlin a écrit :
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 ?
Certes, sauf qu'avec vim je n'ai pas besoin que mes actions soient
parfaites dès le départ. En gros, je commence par mettre dans un
fichier la liste des noms de fichiers à traiter, puis je peux
faire un « :%s/.*/mv & &/ » avant de changer le nom de droite, ou
bien je peux tenter de le faire du premier coup, bref j'ai toute
latitude de me tromper jusqu'au moment où le fichier contient la
liste des commandes 'mv' qui me convient, et que je peux lancer
son exécution.
Le faire en une commande sed, awk, ou autre, serait bien sûr
possible, mais me demanderait plus d'efforts pour être certain
de ne pas me tromper.
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 ?
Certes, sauf qu'avec vim je n'ai pas besoin que mes actions soient parfaites dès le départ. En gros, je commence par mettre dans un fichier la liste des noms de fichiers à traiter, puis je peux faire un « :%s/.*/mv & &/ » avant de changer le nom de droite, ou bien je peux tenter de le faire du premier coup, bref j'ai toute latitude de me tromper jusqu'au moment où le fichier contient la liste des commandes 'mv' qui me convient, et que je peux lancer son exécution.
Le faire en une commande sed, awk, ou autre, serait bien sûr possible, mais me demanderait plus d'efforts pour être certain de ne pas me tromper.
Cordialement, -- Olivier Miakinen
Olivier Miakinen
Le 31/01/2012 11:11, Cyrille Lefevre a écrit :
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
Joli, mais pour un script qui sera utilisé plusieurs fois avec les mêmes paramètres, non pas pour une utilisation ponctuelle. Cela dit, je reconnais que je n'avais pas été assez explicite dans ma question, et en outre je te remercie de m'avoir rappelé les syntaxes de remplacement de paramètres.
Juste histoire de chipoter quand même, pour l'exemple demandé il m'aurait fallu faire deux corrections à ton script : - remplacer « jpg » par « png » - supprimer la ligne « (( j < 1000 )) && k=0$k » (elle fait des nombres à quatre chiffres et non à trois chiffres).
Merci en tout cas !
-- Olivier Miakinen
Le 31/01/2012 11:11, Cyrille Lefevre a écrit :
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
Joli, mais pour un script qui sera utilisé plusieurs fois avec les
mêmes paramètres, non pas pour une utilisation ponctuelle. Cela dit,
je reconnais que je n'avais pas été assez explicite dans ma question,
et en outre je te remercie de m'avoir rappelé les syntaxes de
remplacement de paramètres.
Juste histoire de chipoter quand même, pour l'exemple demandé il
m'aurait fallu faire deux corrections à ton script :
- remplacer « jpg » par « png »
- supprimer la ligne « (( j < 1000 )) && k=0$k » (elle fait des nombres
à quatre chiffres et non à trois chiffres).
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
Joli, mais pour un script qui sera utilisé plusieurs fois avec les mêmes paramètres, non pas pour une utilisation ponctuelle. Cela dit, je reconnais que je n'avais pas été assez explicite dans ma question, et en outre je te remercie de m'avoir rappelé les syntaxes de remplacement de paramètres.
Juste histoire de chipoter quand même, pour l'exemple demandé il m'aurait fallu faire deux corrections à ton script : - remplacer « jpg » par « png » - supprimer la ligne « (( j < 1000 )) && k=0$k » (elle fait des nombres à quatre chiffres et non à trois chiffres).
Merci en tout cas !
-- Olivier Miakinen
Olivier Miakinen
Le 31/01/2012 15:44, Stephane Le Men a écrit :
for i in {1..99} do printf "mv photo%d.png photo%.3d.pngn" $i $i done | sh
Pas bête, et c'est effectivement très court, mais cela appelle mv un certain nombre de fois pour rien, pour tous les fichiers qui n'existent pas.
Cordialement, -- Olivier Miakinen
Le 31/01/2012 15:44, Stephane Le Men a écrit :
for i in {1..99}
do
printf "mv photo%d.png photo%.3d.pngn" $i $i
done | sh
Pas bête, et c'est effectivement très court, mais cela appelle
mv un certain nombre de fois pour rien, pour tous les fichiers
qui n'existent pas.
for i in {1..99} do printf "mv photo%d.png photo%.3d.pngn" $i $i done | sh
Pas bête, et c'est effectivement très court, mais cela appelle mv un certain nombre de fois pour rien, pour tous les fichiers qui n'existent pas.
Cordialement, -- Olivier Miakinen
Olivier Miakinen
Le 02/02/2012 21:23, 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
Ce n'est pas le seul effet indésirable : tout comme l'exemple de Stéphane Chazelas avec zsh, cela tronque les nombres de 4 chiffres et plus.
qu'on peut eviter en faisant un grep -v '^... ' apres le 1er sed par exemple
On peut aussi éviter cet autre effet par un grep, mais ça complique encore. Finalement, la commande mmv me semble idéale et c'est ce que je vais retenir.
Cordialement, -- Olivier Miakinen
Le 02/02/2012 21:23, 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
Ce n'est pas le seul effet indésirable : tout comme l'exemple
de Stéphane Chazelas avec zsh, cela tronque les nombres de 4
chiffres et plus.
qu'on peut
eviter en faisant un grep -v '^... ' apres le 1er sed par exemple
On peut aussi éviter cet autre effet par un grep, mais ça complique
encore. Finalement, la commande mmv me semble idéale et c'est ce
que je vais retenir.
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
Ce n'est pas le seul effet indésirable : tout comme l'exemple de Stéphane Chazelas avec zsh, cela tronque les nombres de 4 chiffres et plus.
qu'on peut eviter en faisant un grep -v '^... ' apres le 1er sed par exemple
On peut aussi éviter cet autre effet par un grep, mais ça complique encore. Finalement, la commande mmv me semble idéale et c'est ce que je vais retenir.
Cordialement, -- Olivier Miakinen
Olivier Miakinen
Le 03/02/2012 07:36, 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
En relisant ce message je vous que certains lecteurs de news interpretent des caracteres pour mise en italique, etc...
Ah oui, il arrive même que les caractères /, _ ou * soient supprimés ! Heureusement, cette idée stupide est généralement configurable. ;-)
idealement regarder le source du message pour avoir la bonne syntaxe
... ou en profiter pour changer la config de son nouvelleur.
Le 03/02/2012 07:36, 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
En relisant ce message je vous que certains lecteurs de news
interpretent des caracteres pour mise en italique, etc...
Ah oui, il arrive même que les caractères /, _ ou * soient supprimés !
Heureusement, cette idée stupide est généralement configurable. ;-)
idealement regarder le source du message pour avoir la bonne syntaxe
... ou en profiter pour changer la config de son nouvelleur.
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...
Ah oui, il arrive même que les caractères /, _ ou * soient supprimés ! Heureusement, cette idée stupide est généralement configurable. ;-)
idealement regarder le source du message pour avoir la bonne syntaxe
... ou en profiter pour changer la config de son nouvelleur.
Olivier Miakinen
Le 05/02/2012 00:09, a écrit :
le shell et ls suffisent a isoler les fichiers contenants 1 ou 2 digits consé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'
Ouf ! Là j'ai besoin d'un peu plus de temps parce que je ne connaissais pas les commandes h, t, H et g de sed. Mais je suis ravi d'apprendre.
Merci !
-- Olivier Miakinen
Le 05/02/2012 00:09, shagounet@hotmail.com a écrit :
le shell et ls suffisent a isoler les fichiers contenants 1 ou 2 digits consé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'
Ouf ! Là j'ai besoin d'un peu plus de temps parce que je ne connaissais
pas les commandes h, t, H et g de sed. Mais je suis ravi d'apprendre.
le shell et ls suffisent a isoler les fichiers contenants 1 ou 2 digits consé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'
Ouf ! Là j'ai besoin d'un peu plus de temps parce que je ne connaissais pas les commandes h, t, H et g de sed. Mais je suis ravi d'apprendre.
Merci !
-- Olivier Miakinen
Lucas Levrel
Le 10 février 2012, Olivier Miakinen a écrit :
On peut aussi le faire en une seule commande : mmv photo[0-9].* photo00#1.#2 photo[0-9][0-9].* photo0#1#2.#3 ^D
Bien sûr, n'oublie pas les '', ou (sous bash) utilise set -f (puis set +f).
-- LL
Le 10 février 2012, Olivier Miakinen a écrit :
On peut aussi le faire en une seule commande :
mmv
photo[0-9].* photo00#1.#2
photo[0-9][0-9].* photo0#1#2.#3
^D
Bien sûr, n'oublie pas les '', ou (sous bash) utilise set -f (puis set
+f).
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 &)
Antoine
Olivier Miakinen
Le 13/02/2012 12:24, Lucas Levrel m'a répondu :
On peut aussi le faire en une seule commande : mmv photo[0-9].* photo00#1.#2 photo[0-9][0-9].* photo0#1#2.#3 ^D
Bien sûr, n'oublie pas les ''
Justement non, pas dans le cas où je lance mmv sans paramètre, et que la liste des changements à effectuer est saisie « dans » mmv et pas dans le shell !
Le 13/02/2012 12:24, Lucas Levrel m'a répondu :
On peut aussi le faire en une seule commande :
mmv
photo[0-9].* photo00#1.#2
photo[0-9][0-9].* photo0#1#2.#3
^D
Bien sûr, n'oublie pas les ''
Justement non, pas dans le cas où je lance mmv sans paramètre, et que la
liste des changements à effectuer est saisie « dans » mmv et pas dans le
shell !
On peut aussi le faire en une seule commande : mmv photo[0-9].* photo00#1.#2 photo[0-9][0-9].* photo0#1#2.#3 ^D
Bien sûr, n'oublie pas les ''
Justement non, pas dans le cas où je lance mmv sans paramètre, et que la liste des changements à effectuer est saisie « dans » mmv et pas dans le shell !