Forum Linux.général Petit script de renommage de vidéos avec petits soucis

Posté par  . Licence CC By‑SA.
Étiquettes :
1
6
mai
2023

Salut,

J'ai écrit un tout petit script simple mais pas si efficace pour renommer mes vidéos selon plusieurs critères :

    #!/bin/bash
    #Nom donné aux vidéos
    read -p "Nom des vidéos : " nom
    #Numéro des vidéos
    num=1
    for file in *.mp4
    do
        date=$(mediainfo "$file" | grep date | head -n 1 | cut -b 48-57)
        time=$(mediainfo "$file" | grep date | head -n 1 | cut -c 59-66)
        newname="`{mathjax} {date} (`{time}) - `{mathjax} {nom} - `{num}.mp4"
        mv -v "$file" "$newname"
        ((num++))  
    done
  • La date et l'heure en premier
  • Le nom des vidéos (c'est un nom arbitraire que je choisis au lancement du script)
  • Le numéro de la vidéo dans la liste

Ça donne des noms de ce style :

2023-03-28 (14:32:11) - Anniversaire de Youmna - 1.mp4
2023-03-28 (14:48:20) - Anniversaire de Youmna - 2.mp4
2023-03-28 (15:52:03) - Anniversaire de Youmna - 3.mp4

J'ai un souci cependant…La numération est juste seulement si les fichiers étaient déjà dans l'ordre chronologique avant le traitement. Selon les noms, ils peuvent néanmoins être traités dans le désordre, ce qui donnerait un classement A-Z juste dans le gestionnaire de fichiers malgré tout (grâce aux dates et horaires) mais faux dans le nombre qui est attribué à chaque fichier. Je n'ai pas trouvé de solution simple pour résoudre le problème, si ce n'est lancer le script deux fois. Auriez-vous des suggestions s'il vous plaît ?

  • # Commentaire supprimé

    Posté par  . Évalué à 1.

    Ce commentaire a été supprimé par l’équipe de modération.

    • [^] # Re: Solution brutale & quelques trucs

      Posté par  . Évalué à 2.

      Pour avoir la bonne numérotation sans se prendre trop la tête, effectuer un premier renommage uniquement avec les date et heures, puis un second pour ajouter le numéro.

      C'est ce que je fais présentement, comme je le dis plus haut, je lance deux fois le script ! ^

      Sinon, il me semble que ce script est fragile si les noms de fichiers comportent des espaces, dès le for.

      Les noms de mes fichiers sont formatés très simplement.

      • [^] # Commentaire supprimé

        Posté par  . Évalué à 2.

        Ce commentaire a été supprimé par l’équipe de modération.

        • [^] # Re: Solution brutale & quelques trucs

          Posté par  . Évalué à 3.

          La commande find est utilisée parfois pour protéger les noms de fichiers (-print0), et ls aussi avec l’option qui permet d’échapper les caractères spéciaux en sortie. On peut aussi regarder du côté de la variable shell IFS et les options de la commande read (-d en bash ?).

          Mais je dois dire que je prends toujours soin d’utiliser des noms de fichiers pas trop emmerdants… pour pas avoir à trop me prendre la tête avec ça.

          Pour en revenir à la problématique initiale. Faut faire une boucle qui sort l’horodatage et le nom du fichier source dans un fichier temporaire. En pseudo-script shell :

          tmp=`mktemp`
          for src in *.mp4
          do [] echo $horodatage $src >>$tmp
          done
          []
          sort $tmp | while read horodatage src
          do
            []
            mv $src $dst
          done
          rm $tmp

          Si t’es motivé tu peux chaîner aussi les boucles while ou for à travers des pipe, pour ne pas avoir à créer un fichier temporaire ^^ :

          for src in *.mp4
          do
            []
            echo […x…]
          done \
          | sort \
          | while read […x…]
          do
            []
          done

          Mets ton nom de fichier en fin de ligne, comme ça la présence d’espaces dedans sera plus simple à gérer au besoin.

          S’arranger pour que l’horodatage soit dans un format directement triable (année-mois-jour-heure-minutes-secondes(.fraction) ou timestamp Unix).

Suivre le flux des commentaires

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