我有一个巨大的网络摄像头视频文件列表,它们看起来像这样:
video_123 video_456 video_789 ...
其中每个数字(123、456 和 789)代表文件的开始时间,以秒为单位自纪元以来。这些文件是根据文件大小创建的,并且持续时间并不总是相同。文件中也可能存在间隙(例如,相机停机一个小时)。这是我无法更改的自定义文件格式。
我有一个工具可以在给定时间范围和一组文件的情况下提取部分视频。但是,如果我只为工具提供帧在给定范围内的文件,它将运行得更快。确定每个文件的持续时间非常昂贵。相反,我想使用开始时间戳来排除大多数文件。例如,如果我想要 500-600 的视频,我知道将不需要 video_123
,因为 video_456
更大。此外,video_789
大于 600,因此也不需要它。
我可以执行 ls
并遍历每个文件,将时间戳转换为 int 并进行比较,直到我们找到一个大于所需范围的文件。我有很多文件,这很慢。有没有更快的方法?我正在考虑拥有某种可以获取 log2n 搜索时间并且已经解析出时间戳的二叉树。我在 bash 中完成大部分工作,并且更喜欢使用简单、常用的工具,如 grep、awk 等。但是,如果有令人信服的理由,我会考虑 Perl 或其他一些大型脚本语言。
最佳答案
如果您对文件进行多次搜索,您可以预处理文件,将它们加载到 bash 数组(注意,bash,而不是 sh)中,对它们进行排序,然后进行二进制搜索。暂时假设文件名只是时间标签,这将简化示例(您始终可以执行 ${variable/video_/}
来删除前缀。)
首先,您可以使用一个数组来加载所有排序的文件:
files=(`echo * | sort -n`)
然后实现二分搜索(只是一个草图,搜索pos $min
-$max
):
nfiles=${#files[*]}
nfiles2=`expr $nfiles / 2`
if test ${files[$nfiles2]} -gt $max
then
nfiles2=`expr $nfiles2 - $nfiles2/2`
else
#check $min, etc.
fi
等等。一旦您在数组中对文件进行排序,搜索几次将使查找速度更快。
关于linux - 如何快速推断仅显示开始时间的文件的开始/结束时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3964053/