我有大量的图像,我想时不时地从中提供一些图像ffmpeg
。但是我仅有的想要喂养按字母顺序排列的后某些图像(上次运行的最后一帧,名称存储在某个文件中)。
例如,我可以找出该文件的顺序/索引号,然后使用head
该tail
编号吗?
或者有一些神奇的东西-pattern_type glob
我可以用作ffmpeg -i
参数吗?
迄今为止最好的过滤解决方案似乎是这个,但似乎有点重的:
find . -maxdepth 1 -type f | sort | awk '$0 > "./picture_2022-04-22_13-46-12.jpg"'
一种替代方法是将列表放入文本文件中,在那里进行解析并将文本文件提供给 ffmpeg 但我想有一些更简单的方法吗?
答案1
排序后,可以使用 somesed
或awk
来匹配从模式到流末尾的内容。我假设您的最终ffmpeg
命令接受文件参数列表。我用 aprintf
代替ffmpeg
下面的。
find . -type f -print0 | sort -z | sed -nz '/pattern/,$p' | xargs -r0 printf '%s\n'
使用 GNU 参数分隔。sed
命令过滤排序的参数,从模式(包括)到流的末尾。
如果您想从模式获取文件,直到,而不是结束,而是直到第二个模式,唯一的修改是sed
,它变成sed -zn '/pattern1/,/pattern2/p'
。
对于您的情况(深度 1),我们不测试常规文件的更短替代方案是:
printf '%s\0' ./*.jpg | sed -nz '/pattern/,$p' | xargs -r0 printf '%s\n'
这里的文件在第一步之后就已经按字母顺序排序了。
另外,您可以与不一定存在于文件名中的字符串进行比较,排除或包含,最好像awk
您已经做的那样使用。例如,获取所有命名日期晚于 的文件2022-01
:
printf '%s\0' ./*.jpg | awk 'BEGIN {RS=ORS="\0"} $0 > "./picture_2022-01"' | xargs -r0 printf '%s\n'
答案2
和zsh
:
last=picture_2022-04-22_13-46-12.jpg
# or last=$(<file_that_contains_the_filename)
ffmpeg ... picture_*.jpg(e['[[ $REPLY > $last ]]'])
这是使用e
评估全局限定符将 glob 扩展限制为计算代码返回 true 的文件。
另请参阅[[ $REPLY -nt $last ]]
选择文件n
ewer t
han $last
(类似于find -newer
)。
使用bash
,您可以执行类似的操作:
last=picture_2022-04-22_13-46-12.jpg
(
shopt -s nullglob
files=()
for file in picture_*.jpg; do
if [[ $file > $last ]]; then
files+=("$file")
fi
done
if (( ${#files[@]} > 0 )); then
ffmpeg ... "${files[@]}"
else
echo >&2 No match; exit 1
fi
)