Forum Linux.général Renommage en masse selon métadonnées.

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
29
juil.
2019

Bonjour,

J'aimerais renommer mes vidéos selon les métadonnées de date (ça fait un peu suite à mes dernières demandes).
Du coup, j'ai "écrit" (…recopié des bouts…) ce script :

#!/bin/bash
for src in src/*.mp4 ; do
    heure=$(exiftool -DateTimeOriginal ${src} |sed -e 's/^.*: //')
    cp ${src} dst/"${heure}.mp4"
done

Pour des fichiers dans un dossier src (source) destinés à un dossier dst (destination).

Ça fonctionne, mais je n'ai pas réussi à faire trois choses :

1) Le faire pour tous les fichiers mp4 et MP4 (j'aurais pu garder l'astérisque seulement, j'imagine, mais j'ai parfois d'autres fichiers).
2) Ajouter le nom, du type 2019:01:01 12:00:00_DSC09001.mp4" (le DSC09001.mp4)
3) Être un peu plus "verbeux" si possible.

Pourriez-vous me donner des pistes, s'il vous plaît ? :)

  • # find est ton ami

    Posté par  (site Web personnel) . Évalué à 3.

    Tu utilises :

    #!/bin/bash
    for src in src/*.mp4 ; do
    heure=$(exiftool -DateTimeOriginal ${src} |sed -e 's/^.*: //')
    cp ${src} dst/"${heure}.mp4"
    done
    

    En fonction du shell, tu peux probablement feinter pour ignorer la casse, mais ceci est portable : find src -type f -iname '*.mp4' (tu peux jouer avec -name versus -iname et/ou regarder la documentation).

    Pour ajouter le nom, tu as la variable $src qui peut servir. Tu peux extraire le nom du fichier avec basename (cf. aussi dirname).

    Pour la verbosité, cp, mv, etc. ont une option -v. Sinon tu peux faire du echo ou printf toi-même.

    Bonnes évolutions.

    Debian Consultant @ DEBAMAX

    • [^] # Re: find est ton ami

      Posté par  . Évalué à 1.

      L'option -v…quel imbécile je fais parfois. :D

      Merci pour les pistes (dont basename, en fait, dont j'ai déjà emprunté l'usage à l'aveugle, finalement…).

      Je devrais m'en sortir ! :)

  • # $(ls *.mp4 *.MP4)

    Posté par  . Évalué à 3. Dernière modification le 29/07/19 à 14:55.

    Salut,

    for f in $(ls *.mp4 *.MP4); do echo "Commande $f"; done
    

    Commande test1.mp4
    Commande test2.MP4

    donc je pense que devrait fonctionner avec ça:

    for src in $(ls src/*.mp4 src/*.MP4) ; do
        heure=$(exiftool -DateTimeOriginal ${src} |sed -e 's/.: //')
        cp ${src} dst/"${heure}.mp4"
    done
    • [^] # Re: $(ls *.mp4 *.MP4)

      Posté par  . Évalué à 1.

      Je vais également tester cette façon de lister les fichiers qui m'intéressent (ça peut servir pour d'autres formats, du coup).

      Merci bien ! :)

    • [^] # Plus simple

      Posté par  . Évalué à 3.

      Bonjour,

      Pourquoi faire si compliqué ?
      for in accepte plusieurs arguments (d’ailleurs même si l’on ne met qu’un seul nom avec un joker, il est développé avant d’être passé à cette instruction.

      Donc

      for f in src/*.mp4 src/*.MP4; do

      fera l’affaire.

      Sinon, j’aurais utilisé cp -p voire cp -a pour préserver les dates et les attributs des fichiers.

      Quoique s’il s’agit réellement de renommer comme dit dans la question, c’est mv qu’il faut (mais l’utilisation de cp est peut-être pour s’assurer que le résultat convienne avant de supprimer les fichiers originaux).

      Guerres, déréglement climatique, effondrement de la biodiversité, épuisement des ressources, pandémie, montée du fascisme, de l’intégrisme et du complotisme… On vit une époque formidable…

      • [^] # Re: Plus simple

        Posté par  . Évalué à 1.

        Merci ! :)

        Je travaille toujours sur des sauvegardes et l'utilisation de cp plutôt que de mv, c'est simplement pour éviter une copie de plus. :D

  • # Encore plus simple…

    Posté par  . Évalué à 2.

    Salut,

    for f in src/*.[mM][pP]4; do

    ;-))

    PS. À noter que "ls" est à proscrire dans un script ;-(

  • # -eu

    Posté par  (site Web personnel) . Évalué à 3.

    ProTip : Utilise #!/bin/bash -eu pour qu ton script s'arrête à la première erreur plutôt que de continuer à faire des conneries :D

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.