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 ?

  • # Solution brutale & quelques trucs

    Posté par  . Évalué à 1.

    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.

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

    Pour le reste, l'utilisation de guillemets est correcte pour ce problème.

    Je préféres la notation :

    while read file
    do
        ...
    done< <(ls *.mp4)
    

    Pas à l'abri d'une typo, écrit de tête.
    Et valable après avoir vérifié que ls n'était pas un alias ajoutant des paramètres indésirables.

    Accessoirement, cette notation évite le problème du shell fils lancé discrètement avec la forme :

    ls *.mp4 | while read file
    do
        ...
    done
    

    En effet, le | lance un nouveau shell pour la boucle while.
    Toute variable déclarée avant la boucle deviendrait inaccessible à l'intérieure de celle-ci.

    • [^] # 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.

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

        Posté par  . Évalué à 2.

        Oui, mais il suffirait de faire deux boucles, la première n'a pas besoin de se préoccuper des n°, et la seconde pour les n° uniquement.

        Pour l'autre soucis, c'est toujours plus prudent de prendre en compte les potentiels espaces dans les noms. Parce que le jours où un espace se glisse là où il ne faut pas, les conséquences pourraient être fâcheuses …

        • [^] # 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.