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 AncalagonTotof . É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 :
Pas à l'abri d'une typo, écrit de tête.
Et valable après avoir vérifié que
ls
n'était pas unalias
ajoutant des paramètres indésirables.Accessoirement, cette notation évite le problème du
shell fils
lancé discrètement avec la forme :En effet, le
|
lance un nouveaushell
pour la bouclewhile
.Toute variable déclarée avant la boucle deviendrait inaccessible à l'intérieure de celle-ci.
[^] # Re: Solution brutale & quelques trucs
Posté par Stinouff . Évalué à 2.
C'est ce que je fais présentement, comme je le dis plus haut, je lance deux fois le script ! ^
Les noms de mes fichiers sont formatés très simplement.
[^] # Re: Solution brutale & quelques trucs
Posté par AncalagonTotof . É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 ml . Évalué à 3.
La commande
find
est utilisée parfois pour protéger les noms de fichiers (-print0
), etls
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 shellIFS
et les options de la commanderead
(-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 :
Si t’es motivé tu peux chaîner aussi les boucles
while
oufor
à travers des pipe, pour ne pas avoir à créer un fichier temporaire^^
: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.