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

7

Ich habe einen Ordner namens Tutorials . Darin befinden sich ungefähr 15 Ordner, die jeweils ungefähr 15-20 .mp4Videodateien enthalten. Ich möchte die Gesamtdauer aller im Ordner vorhandenen Dateien abrufen tutorials. 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 Ausführung einen Fehler File not found: ./*.mp4für jeden der in den Tutorials vorhandenen Unterordner aus . Allerdings, wenn die Linie

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

Wird in jedem Unterordner einzeln ausgeführt, kann ich die richtige Ausgabe erhalten.

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

Rücktaste
quelle

Antworten:

4

Sie können dies stattdessen verwenden, wodurch Sie alle Ihre mp4s in einem bestimmten Ordner und allen Unterordnern finden und ihre Dauer auf insgesamt summieren. Dies ist auch wichtig, wenn sie Sonderzeichen wie ein Leerzeichen usw. haben.

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
Ziazis
quelle
Ah ok, konnte es nicht aus deiner Frage vorlesen. Verwenden Sie einfach das Skript, das ich bearbeitet habe. Sie können auch Funktionen erstellen und über einen Parameter aufrufen, den Sie beim Ausführen des Skripts aufrufen. So können Sie umschalten, was Sie tatsächlich sehen möchten. Oder Sie lassen sie einfach so, um immer alles zu sehen.
Ziazis
5

Sie sollten ersetzen ./*.mp4durch "$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

Ihre for-Schleife sucht nach Verzeichnissen in ~ / Videos / tutorials / und weist dem Wert der dVariablen ihren Pfad 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, cdjedes Mal auf das Verzeichnis zuzugreifen, sodass Ihr Code wie folgt lautet:

 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 problematische Dateinamen für einige der mp4-Dateien haben, z. B. Leerzeichen. Es speichert die Dateinamen in einem Array und erweitert sie im exiftoolBefehl.

 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
Arronisch
quelle
Können wir es modifizieren, um die Summe aller oben erhaltenen Einzeldauern zu berechnen und es am Ende der Ausgabe anzuhängen?
Rücktaste
Sie werden Probleme haben, wenn die Namen jemals ein Leerzeichen bekommen oder die mp4 einen seltsamen Namen hat. Die werden dann nicht funktionieren.
Ziazis
Guter Punkt @Ziazis. Es ist ein Nachteil, dort einen Glob zu verwenden. Ich denke, ich kann den Verzeichnisnamen durch Zitieren schützen, aber nicht durch Dateinamen. Es wäre möglich, die Dateien zu durchlaufen und jeweils 'exiftool' zu verwenden, wobei die Addition außerhalb des exiftool-Befehls erfolgt, aber ich nehme an, find ist der bessere Ansatz.
Arronical