如何获取包含多个子文件夹的文件夹中所有视频文件的时长?

如何获取包含多个子文件夹的文件夹中所有视频文件的时长?

我有一个名为的文件夹教程。里面大约有 15 个文件夹,每个文件夹包含大约 15-20 个.mp4视频文件。我想获取文件夹中所有文件的总时长tutorials。这是我到目前为止编写的代码:

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

File not found: ./*.mp4上述代码在执行时,会为每个子文件夹给出错误教程。然而,当

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

在每个子文件夹内单独执行,我能够得到正确的输出。

我应该对上面的代码做哪些更改才能使其正常工作?

答案1

您可以改用这个,它会找到特定文件夹和所有子文件夹中的所有 mp4,并将它们的总时长相加。它还会注意它们是否包含空格等特殊字符。

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

查看每个子文件夹的总数

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

答案2

您应该替换./*.mp4"$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

您的 for 循环将在 ~/Videos/tutorials/ 中查找任何目录并将其路径分配给变量的值d。这是您要使用 exiftool 检查 mp4 文件的目录,而您告诉 exiftool 使用当前目录./

另一种方法是cd每次都进入目录,因此您的代码将变成:

 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

如果某些 mp4 文件的文件名比较麻烦(例如包含空格),可以使用以下方法。它将文件名保存到数组中,并在命令中引用它们进行扩展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

相关内容