it-swarm.com.de

Wie kann ich die Dauer aller Videodateien in einem Ordner mit mehreren Unterordnern ermitteln?

Ich habe einen Ordner namens Tutorials. Darin befinden sich ungefähr 15 Ordner mit jeweils ungefähr 15-20 .mp4 Videodateien. Ich möchte die Gesamtdauer aller im Ordner tutorials vorhandenen Dateien abrufen. Dies ist der Code, den ich bisher geschrieben habe:

 for d in ~/Videos/tutorials/*; do
   if [ -d "$d" ]; then
     exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' ./*.mp4| tail -n1
   fi
 done

Der obige Code gibt bei der Ausführung einen Fehler File not found: ./*.mp4 für jeden der in Tutorials enthaltenen Unterordner aus. Wenn jedoch die Leitung

exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' ./*.mp4| tail -n1

wird in jedem Unterordner einzeln ausgeführt, kann ich die richtige Ausgabe bekommen.

Welche Änderungen sollte ich am obigen Code vornehmen, damit er funktioniert?

7
Backspace

Sie können dies stattdessen verwenden, um alle Ihre MP3-Dateien in einem bestimmten Ordner und allen Unterordnern zu finden und ihre Dauer zu einer Gesamtsumme zu addieren. Dies ist auch dann wichtig, wenn sie Sonderzeichen wie Leerzeichen usw. enthalten.

find ~/Videos/tutorials/ -name "*.mp4" -printf "\"%p\" " | xargs exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' | tail -n 1

Anzeigen der Gesamtsummen aller Unterordner

#!/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

Sie sollten ./*.mp4 durch "$d"/*.mp4 ersetzen:

 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

Ihre for-Schleife findet Verzeichnisse in ~/Videos/tutorials/und weist den Pfad dem Wert der Variablen d zu. Dies ist das Verzeichnis, in dem Sie mit exiftool nach mp4-Dateien suchen möchten, während Sie exiftool anweisen, das aktuelle Verzeichnis mit ./ zu verwenden.

Ein anderer Ansatz wäre, jedes Mal cd auf das Verzeichnis zuzugreifen, sodass Ihr Code folgendermaßen aussehen würde:

 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

Der folgende Ansatz kann verwendet werden, wenn Sie für einige der mp4-Dateien problematische Dateinamen haben, z. B. Leerzeichen. Die Dateinamen werden in einem Array gespeichert und im Befehl exiftool in Anführungszeichen gesetzt.

 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