web-dev-qa-db-fra.com

Comment obtenir la durée de tous les fichiers vidéo d'un dossier contenant plusieurs sous-dossiers?

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 tutorialsname__. 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?

7
Backspace

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
4
Ziazis

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
5
Arronical