我想在 Linux 中制作一个 BASH 脚本。到目前为止我有以下内容
#!/bin/bash
for file in $(find "/home/drive1/videos" -type f -name '*.mp4' -o -name '*.avi' -o -name '*.mov'); do
size=$(stat -c%s "$file")
duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")
ratio=$(echo "scale=2; $size / $duration" | bc)
echo "$file: size=$size, duration=$duration, ratio=$ratio"
done
但这给出了一个错误
stat: 无法 statx '/home/drive1/videos/file': 没有这样的文件或目录 /home/drive1/videos/file: 没有这样的文件或目录 (standard_in) 1: 语法错误 /home/drive1/videos/file:大小=、持续时间=、比例=
但是如果我只运行 find
find . -type f -name '*.mp4' -o -name '*.avi' -o -name '*.mov'
它显示文件:
./文件.mov
ffprobe 也可以工作,因为它使用以下命令显示视频文件的持续时间(以秒为单位)
ffprobe -v quiet -of csv=p=0 -show_entries format=duration file.mov
40.707333
我做错了什么,有什么想法吗?提前感谢您的帮助!
干杯
答案1
请修改您的表达式以添加括号,以确保您的目标文件具有正确的扩展名。
find . -type f '(' -name '*.mp4' -o -name '*.avi' -o -name '*.mov' ')'
答案2
问题不在于查找,而在于 for 循环以及它如何处理文件名中的空格。我发现while
-loops 对此非常方便:
find "/home/drive1/videos" -type f -name '*.mp4' -o -name '*.avi' -o -name '*.mov' | while read -r file
do
size=$(stat -c%s "$file")
duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")
ratio=$(echo "scale=2; $size / $duration" | bc)
echo "$file: size=$size, duration=$duration, ratio=$ratio"
done