J'ai un dossier nommé tutorials. Il contient environ 15 dossiers contenant chacun environ 15 à 20 fichiers vidéo .mp4
. Je souhaite obtenir la durée totale de tous les fichiers présents dans le dossier tutorials
name__. C'est le code que j'ai écrit jusqu'à présent:
for d in ~/Videos/tutorials/*; do
if [ -d "$d" ]; then
exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' ./*.mp4| tail -n1
fi
done
Le code ci-dessus, lorsqu'il est exécuté, génère une erreur File not found: ./*.mp4
pour chacun des sous-dossiers présents à l'intérieur de tutoriels. Cependant, quand la ligne
exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' ./*.mp4| tail -n1
est exécuté individuellement dans chaque sous-dossier, je peux obtenir le bon résultat.
Quelles modifications dois-je apporter au code ci-dessus pour le faire fonctionner?
Vous pouvez utiliser cette option à la place, qui trouve tous vos mp4 dans un dossier spécifique et tous les sous-dossiers et ajoute leur durée totale. Cela prend également soin s'ils ont des caractères spéciaux comme un espace, etc.
find ~/Videos/tutorials/ -name "*.mp4" -printf "\"%p\" " | xargs exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' | tail -n 1
Pour afficher également les totaux de chaque sous-dossier
#!/bin/bash
SEARCHPATH=~/Videos/tutorials
echo "## TOTAL OF EVERY MP4"
find $SEARCHPATH -name "*.mp4" -printf "\"%p\" " | xargs exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' | tail -n 1
find $SEARCHPATH -type d > /tmp/allFolders.txt
while read -r; do
echo "## TOTAL OF $REPLY"
find "$REPLY" -maxdepth 1 -name "*.mp4" -printf "\"%p\" " | xargs exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' | tail -n 1
done < /tmp/allFolders.txt
#cleanup
rm /tmp/allFolders.txt
Vous devez remplacer ./*.mp4
par "$d"/*.mp4
:
for d in ~/Videos/tutorials/*; do
if [ -d "$d" ]; then
exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' "$d"/*.mp4| tail -n1
fi
done
Votre boucle for recherche tous les répertoires situés dans ~/Videos/tutorials/et attribue son chemin à la valeur de la variable d
. C'est le répertoire dans lequel vous voulez vérifier les fichiers mp4 avec exiftool, alors que vous dites à exiftool d'utiliser le répertoire actuel avec ./
.
Une autre approche consisterait à cd
dans le répertoire à chaque fois, afin que votre code devienne:
for d in ~/Videos/tutorials/*; do
if [ -d "$d" ]; then
cd "$d"
exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' ./*.mp4| tail -n1
fi
done
L'approche suivante peut être utilisée si vous avez des noms de fichiers problématiques pour certains fichiers mp4, tels que des espaces. Il enregistre les noms de fichiers dans un tableau et les développe cités dans la commande exiftool
.
for d in ~/Videos/tutorials/*; do
if [ -d "$d" ]; then
cd "$d"
files=(./*.mp4)
exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' "${files[@]}"| tail -n1
fi
done