我有一个名为的文件夹教程。里面大约有 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