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

Bac*_*ace 7 command-line video scripts exiftool

我有一个名为tutorials的文件夹。在里面,大约有 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
Run Code Online (Sandbox Code Playgroud)

上面的代码在执行时会File not found: ./*.mp4tutorials 中存在的每个子文件夹给出一个错误。然而,当线

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

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

我应该在上面的代码中进行哪些更改才能使其正常工作?

Zia*_*zis 6

您可以改用它,它会在特定文件夹和所有子文件夹中找到您所有的 mp4,并将它们的持续时间总和。这也需要注意它们是否有特殊字符,如空格等。

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

还要查看每个子文件夹的总数

#!/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
Run Code Online (Sandbox Code Playgroud)


Arr*_*cal 5

您应该替换./*.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
Run Code Online (Sandbox Code Playgroud)

您的 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
Run Code Online (Sandbox Code Playgroud)

如果某些 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
Run Code Online (Sandbox Code Playgroud)