过滤文件列表以仅显示特定文件后按字母顺序排列的文件

过滤文件列表以仅显示特定文件后按字母顺序排列的文件

我有大量的图像,我想时不时地从中提供一些图像ffmpeg。但是我仅有的想要喂养按字母顺序排列的某些图像(上次运行的最后一帧,名称存储在某个文件中)。

例如,我可以找出该文件的顺序/索引号,然后使用headtail编号吗?

或者有一些神奇的东西-pattern_type glob我可以用作ffmpeg -i参数吗?

迄今为止最好的过滤解决方案似乎是这个,但似乎有点重的

find . -maxdepth 1 -type f | sort |  awk '$0 > "./picture_2022-04-22_13-46-12.jpg"'

一种替代方法是将列表放入文本文件中,在那里进行解析并将文本文件提供给 ffmpeg 但我想有一些更简单的方法吗?

答案1

排序后,可以使用 somesedawk来匹配从模式到流末尾的内容。我假设您的最终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 ]]选择文件newer than $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
)

相关内容