OVH Cloud OVH Cloud

script bash pour modifier des noms de fichiers

27 réponses
Avatar
Hubert
Bonjour,

J'aimerais renommer les fichiers images transférés d'un appareil
photonumérique dans un répertoire à l'aide d'un script bash.

par exemple : dscf4125.jpg -> 4125paysage.jpg

- éliminer les 4 premières lettres (dscf)
- conserver le n° de quatres chiffres
- ajouter un nom descriptif au fichier (paysage)
- conserver le suffix (.jpg)

Comme vous pouvez vous en douter mes connaissances en programmation sont
(trés) faibles...
Si quelqu'un avait la bonté (et le temps) d'écrire ce script avec moult
commentaires "pas à pas" pour mon éducation.

Avec mes remerciements

Hubert

10 réponses

1 2 3
Avatar
Thomas Nemeth
Le sam 22 nov 2003 à 15:32, Hubert a tapoté :
| Bonjour,

Bonsoir,


| J'aimerais renommer les fichiers images transférés d'un appareil
| photonumérique dans un répertoire à l'aide d'un script bash.
|
| par exemple : dscf4125.jpg -> 4125paysage.jpg
|
| - éliminer les 4 premières lettres (dscf)
| - conserver le n° de quatres chiffres
| - ajouter un nom descriptif au fichier (paysage)
| - conserver le suffix (.jpg)

Et on le devine comment, le descriptif ?

La solution la plus simple que je voie pour le moment c'est
un fichier texte contenant les noms des fichiers et leur
description :
dscf4125.jpg paysage
... ...
Obtenu par un ls -1 > descriptions.txt
puis en rajoutant la description à la main (1 seul mot).

Alors le script est tout simple :
for fichier in dscf*.jpg; do
descr=`grep $fichier descriptions.txt | cut -d ' ' -f 2`
nouveau=`echo $fichier | sed -e "s,dscf,,;s,.jpg,$descr.jpg,'
mv $fichier $nouveau
done


| Avec mes remerciements

Avec plaisir.


Thomas
--
TN: charset=iso-8859-10 C'est quoi ce charset pourri ?
MW: C'est pour l'Inuit, le Lapon et l'Islandais.
TN: I-nuit ? Un concurent de l'I-Mac pour la nuit ;-) ?
-+- TN in Guide du Fmblien Assassin : L'Imac de la nuit -+-
Avatar
Stephane Chazelas
2003-11-22, 15:32(+01), Hubert:
[...]
J'aimerais renommer les fichiers images transférés d'un appareil
photonumérique dans un répertoire à l'aide d'un script bash.


Quoi, il y a encore des gens qui utilisent bash ?

par exemple : dscf4125.jpg -> 4125paysage.jpg

- éliminer les 4 premières lettres (dscf)
- conserver le n° de quatres chiffres
- ajouter un nom descriptif au fichier (paysage)
- conserver le suffix (.jpg)


Ce qu'il te faut, ce n'est pas un shell ou un script, c'est un
outil de renommage de fichiers.

Par exemple, mmv

mmv 'dscf*.jpg' '#1paysage.jpg'

Ou, si tu utilisais zsh plutot que bash:

autoload -U zmv
zmv 'dscf(*).jpg' '$1paysage.jpg'


mmv '[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9].jpg'
'#5#6#7#8paysage.jpg'

ou

zmv '[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]([0-9][0-9][0-9][0-9]).jpg'
'$1paysage.jpg'

éventuellement, suivant ce que tu veux exactement.

Bien sûr, on peut faire en bash ou en tout shell POSIX:

for src in [a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9].jpg; do
dst=${src%.jpg}
dst=${dst#????}paysage.jpg
mv -- "$src" "$dst"
done

Qui est quand même pas très adapté et en tout cas moins sûr.

(j'ai rien testé de tout ça, NB)

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Stephane Chazelas
2003-11-22, 22:21(+00), Thomas Nemeth:
[...]
La solution la plus simple que je voie pour le moment c'est
un fichier texte contenant les noms des fichiers et leur
description :
dscf4125.jpg paysage


Euh, tant qu'à faire, à partir de là, ce n'est pas trop
compliqué de modifier légèrement le fichier pour qu'il contienne

mv -- "dscf4125.jpg" "4125paysage.jpg"

Sinon, si le "paysage" s'obtient en fonction du "dscf", en zsh
toujours, on peut faire:

typeset -A descriptif
descriptif=(
dscf paysage
abcd alphabet
fnsp filles-toutes-nutes-qui-courent-sur-la-plage
vqcr vases-qui-se-cassent-au-ralenti
default image
)
autoload -U zmv
zmv '([[:alpha:]]##)([[:digit:]]##).jpg'
'$2${descriptif[$1]-$descriptif[default]}.jpg'

on peut ajouter l'option "-n" pour qu'il dise ce qu'il ferait
sans le faire vraiment.

Exemple:

$ touch abcd123.jpg abcd125.jpg vqcr3.jpg a1.jpg b1.jpg
$ zmv -n '([[:alpha:]]##)([[:digit:]]##).jpg'
'$2${descriptif[$1]-$descriptif[default]}.jpg'
zmv: error(s) in substitution:

b1.jpg and a1.jpg both map to 1image.jpg

$ descriptif+=(a imageA b imageB)
$ zmv -n '([[:alpha:]]##)([[:digit:]]##).jpg'
'$2${descriptif[$1]-$descriptif[default]}.jpg'
mv -- a1.jpg 1imageA.jpg

mv -- abcd123.jpg 123alphabet.jpg
mv -- abcd125.jpg 125alphabet.jpg
mv -- b1.jpg 1imageB.jpg
mv -- vqcr3.jpg 3vases-qui-se-cassent-au-ralenti.jpg

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
DINH Viêt Hoà

[ script en zsh ]


ça aurait peut-être été mieux un script en sh standard, non ?

tiens, ben il y a un truc qui m'agace quand j'utilise zsh (que je
n'utilise que peu souvent en fait), c'est qu'il faut faire un rehash à
chaque fois qu'on a un nouvel exécutable dans le PATH. Il y a une solution
de fou pour ça ?

--
DINH V. Hoa,

"monde de merde" -- Erwan David

Avatar
Stephane Chazelas
2003-11-23, 12:37(+01), DINH Viêt Hoà:

[ script en zsh ]



C'était pas un script, c'étaient des lignes de commande. Je
n'écris jamais de script.

ça aurait peut-être été mieux un script en sh standard, non ?


Si tu voulais écrire un script, pourquoi pas oui, mais vu que
c'est pour ton usage personnel, il n'a pas besoin d'être
standard.

tiens, ben il y a un truc qui m'agace quand j'utilise zsh (que je
n'utilise que peu souvent en fait), c'est qu'il faut faire un rehash à
chaque fois qu'on a un nouvel exécutable dans le PATH. Il y a une solution
de fou pour ça ?


Pas de problème chez moi avec les options par défaut.
Regarde du côté des options hashcmd, hashlistall...

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]


Avatar
Hubert
On Sat, 22 Nov 2003 23:21:48 +0100, Thomas Nemeth wrote:

| -
ajouter un nom descriptif au fichier (paysage) |


Et on le devine comment, le descriptif ?


Une commande read pour une entrée au clavier est-elle possible ?

Avatar
Stephane Chazelas
2003-11-23, 19:50(+01), Hubert:
[...]
Et on le devine comment, le descriptif ?


Une commande read pour une entrée au clavier est-elle possible ?


Bien sûr.

typeset -A d
zmv -vQ '[a-z]##([0-9]##).jpg(e{
read "d[$REPLY]?descriptif pour $REPLY : "
})' '$1$d[$f].jpg'

(en zsh, toujours).

Tu peux taper CTRL-D, lors du prompt pour ommettre de renommer
ce fichier.

En shells POSIX comme bash (marche aussi avec zsh):

for src in [a-z][a-z][a-z][a-z][0-9][0-9][0-9][0-9].jpg; do
printf 'Descriptif pour "%s" : ' "$src"
read desc || continue
dst=${src%.jpg}
dst=${dst#????}$desc.jpg
(set -x; exec mv -i -- "$src" "$dst")
done

Pour des noms de fichiers formés de 4 lettres suivies de 4
chiffres suivis de ".jpg".

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]


Avatar
Hubert
Je vais essayer tout ça dès que j'aurais un moment.
Merci beaucoup

Hubert
Avatar
Vincent Lefevre
Dans l'article ,
DINH Viêt Hoà écrit:

ça aurait peut-être été mieux un script en sh standard, non ?


Quel intérêt? En ce qui me concerne, si c'est pour la portabilité,
j'ai décidé d'abandonner définitivement sh...

tiens, ben il y a un truc qui m'agace quand j'utilise zsh (que je
n'utilise que peu souvent en fait), c'est qu'il faut faire un rehash
à chaque fois qu'on a un nouvel exécutable dans le PATH. Il y a une
solution de fou pour ça ?


Avec les options par défaut, il n'y a normalement pas besoin.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/> - 100%
validated (X)HTML - Acorn Risc PC, Yellow Pig 17, Championnat International
des Jeux Mathématiques et Logiques, TETRHEX, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

Avatar
Pascal Bourguignon
Vincent Lefevre <vincent+ writes:

Dans l'article ,
DINH Viêt Hoà écrit:

ça aurait peut-être été mieux un script en sh standard, non ?


Quel intérêt? En ce qui me concerne, si c'est pour la portabilité,
j'ai décidé d'abandonner définitivement sh...


Bash est plus portable que sh. Existe-t'il un sh sur Linux? Est ce
que bash n'est pas compilable sur tout les unix qui restent en vie? ;-)


--
__Pascal_Bourguignon__ http://www.informatimago.com/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Living free in Alaska or in Siberia, a grizzli's life expectancy is 35 years,
but no more than 8 years in captivity. http://www.theadvocates.org/


1 2 3