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: ./*.mp4为tutorials 中存在的每个子文件夹给出一个错误。然而,当线
exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' ./*.mp4| tail -n1
Run Code Online (Sandbox Code Playgroud)
在每个子文件夹内单独执行,我能够获得正确的输出。
我应该在上面的代码中进行哪些更改才能使其正常工作?
您可以改用它,它会在特定文件夹和所有子文件夹中找到您所有的 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)
您应该替换./*.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)