Renommer des fichiers dans des sous-dossiers

Résolu/Fermé
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 - 4 nov. 2007 à 19:23
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 - 4 nov. 2007 à 22:33
Bonsoir.

Sous Linux (Ubuntu pour être plus précis), j'aimerais renommer des photos en utilisant la date et l'heure de création contenue dans les informations exifs. J'ai trouvé un petit logiciel très bien, exiv2, qui permet (entre autres) de renommer des photos en utilisant les infos exif. Seulement, il ne permet pas de parcourir plusieurs répertoires.

Je cherche donc de quoi faire une boucle, qui listerait un par un les emplacements des fichiers, pour exploiter ces emplacements avec exiv2.
Je crois que la commande ls permet de faire une boucle, mais je ne trouve pas comment faire précisément.

Quelqu'un a-t-il une solution ?
Merci.
--
Sylvain
P.S.: J'ai aussi cherché à utiliser Krename, python... mais ils ne m'ont pas aidé.

8 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
4 nov. 2007 à 20:39
Salut,

Normalement pour faire une recherche récursive selon certains critères et exécuter une commande derrière on utilise "find" couplé à "exec" :
find /home -name "fichier" -type f -exec mv {} /rep/destination/ \;
Mais dans ton cas ça risque de ne pas le faire.
Donne_moi la syntaxe que tu utilises pour renommer tes fichiers afin d'essayer d'adapter la commande à ton cas.


;-))
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
4 nov. 2007 à 21:03
Merci.

Tout d'abord, mes fichiers sont dans plusieurs sous dossiers de "/home/sylvain/Bureau/Mes images/Photos".

Il sont tous nommés comme ceci : P[numéro du mois][numéro du jour][numéro de la photo].JPG
Exemple : P9060001.JPG, pour la première photo que j'ai prise le 6 septembre.

Par contre, si le numéro du mois est à deux chiffres, c'est une lettre :
janvier : 1
février : 2
...
septembre : 9
octobre : A
novembre : B
décembre : C

Donc par exemple PC250035.JPG, pour la 35° photo prise le 25 décembre.


Ensuite, la syntaxe que j'utilise pour renommer un fichier avec exiv2 :
exiv2 -r %Y-%B-%d--%HH%M mv "/home/sylvain/Bureau/Mes images/Photos/........../P........JPG"
Voici quelques extraits de man exiv2 :
ACTIONS
[...]
       mv | rename
              Rename files and/or set file timestamps according to the Exif create  timestamp.  Uses  the  value  of  tag  Exif.Photo.DateTimeOriginal  or,  if  not  present,
              Exif.Image.DateTime to determine the timestamp. The filename format can be set with -r fmt, timestamp options are -t and -T.
[...]
OPTIONS
[...]
       -r fmt Filename format for the ’rename’ action. The format string follows strftime(3) and supports the following keywords:
              :basename:   - original filename without extension
              :dirname:    - name of the directory holding the original file
              :parentname: - name of parent directory
              Default filename format is %Y%m%d_%H%M%S.

J'utilise donc l'option -r pour spécifier le format du nom du fichier renommé via l'action mv, et %[caractère] pour exporter l'année, l'heure...
L'année correspond à Y, le mois à m, le numéro du jour à d, leure à H, la minute à M et la seconde à S.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
4 nov. 2007 à 21:11
Pendant que tu répondais voilà ce que j'étais en train de tester :
[rep]$ tree
.
|-- FORMULE_1_036.jpg
|-- FORMULE_1_037.jpg
`-- rep1
    |-- FORMULE_1_036.jpg
    |-- FORMULE_1_037.jpg
    `-- rep2
        |-- FORMULE_1_036.jpg
        |-- FORMULE_1_037.jpg
        `-- rep3
            |-- FORMULE_1_036.jpg
            |-- FORMULE_1_037.jpg
            `-- rep4
                |-- FORMULE_1_036.jpg
                `-- FORMULE_1_037.jpg

4 directories, 10 files

[rep]$ find . -name "*.jpg" -type f -exec exiv2 -r':basename:_%Y%m' rename {} \;

[rep]$ tree
.
|-- FORMULE_1_036_200710.jpg
|-- FORMULE_1_037_200710.jpg
`-- rep1
    |-- FORMULE_1_036_200710.jpg
    |-- FORMULE_1_037_200710.jpg
    `-- rep2
        |-- FORMULE_1_036_200710.jpg
        |-- FORMULE_1_037_200710.jpg
        `-- rep3
            |-- FORMULE_1_036_200710.jpg
            |-- FORMULE_1_037_200710.jpg
            `-- rep4
                |-- FORMULE_1_036_200710.jpg
                `-- FORMULE_1_037_200710.jpg

4 directories, 10 files

[rep]$ 
Adapte à ton cas ;-))
0
vignemail1 Messages postés 1246 Date d'inscription vendredi 8 octobre 2004 Statut Contributeur Dernière intervention 13 septembre 2019 259
4 nov. 2007 à 21:14
je pense
find /home -iname "/home/sylvain/Bureau/Mes images/Photos/*.jpg" -type f -exec exiv2 -r %Y-%B-%d--%HH%M mv {} ;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
4 nov. 2007 à 21:29
find /home/sylvain/Bureau/Mes\ images/Photos -iname "*.jpg" -type f -exec exiv2 -r '%Y-%B-%d--%HH%M' rename {} \;
N'oublie pas le "\;" à la fin de l'expression.
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
4 nov. 2007 à 22:03
Merci à tous les deux.

Pour le moment, voici l'expression que j'utilise :
sylvain@sylvain-ordiprincipal-ubuntu:~/Bureau/Mes images/Photos$ find . -iname "*.jpg" -exec exiv2 -r %Y-%m-%d--%HH%Mm%Ss.jpg mv {} +
D'après ce que j'en ai compris :
- find : trouve dans le dossier . (le dossier courant) les fichiers dont le nom correspond à *.jpg (* pour n'importe quel caractère) sans respecter la casse (iname), et pour chaque fichier exécute (-exec) la commande :
- exiv2 pour lire les informations exif et renommer le fichier avec en utilisant -r pour renommer avec le format %Y-%m...... et l'action mv pour renommer le fichier trouvé {}. + sert à finir -exec.

Mais je n'arrive pas à faire fonctionner cette commande. Tout semble marcher, sauf qu'une fois l'opération finie, rien n'est renommé, et parfois j'ai des erreurs du type :
exiv2: File `./dossier/dossier/0-00-00--00H0000s.jpg.JPG' exists. [O]verwrite, [r]ename or [s]kip?
Et quoi que je fasse, (O/r/s), je ne vois rien.

Il y a également comme problème le fait que l'extension .JPG soit gardée, mais je crois que c'est normal.
Et puis, il me suffira de répeter l'opération en utilisant -r :basename.

Peut-être que l'oubli du \; est une cause du problème. Je vais ré-essayer avec.
--
Sylvain
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
4 nov. 2007 à 22:29
et parfois j'ai des erreurs du type :
exiv2: File `./dossier/dossier/0-00-00--00H0000s.jpg.JPG' exists. [O]verwrite, [r]ename or [s]kip?

Ben c'est normal si tu ne conserves rien de spécifique à chaque fichier, chaque fichier est renommé en un seul et unique nom à la seconde près. Vu la vitesse de traitement le 1er est renommé mais dans la foulée le second est renommé avec le même nom d'où la demande de confirmation, là les secondes s'écoulent un troisième est renommé mais ça bute sur le quatrième, etc., etc.
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
4 nov. 2007 à 22:33
Tu veux dire que les données exif seraient incomplètes ?
C'est parfois le cas, mais pas toujours.
Je recommencerais plus tard.
Sinon, pour l'histoire des fichiers non renommés, en fait c'est tout simple : j'avais mis le dossier dans la corbeille, en l'ayant copié au préalable, avant de renommer les fichiers. Les fichiers renommés étaient dans la corbeille, et pas dans le dossier copié (qui avait pourtant le même nom).

Cette commande marche : find . -iname "*.jpg" -exec exiv2 -r %Y-%m-%d--%HH%Mm%Ss.jpg mv {} \;
--
Sylvain
0