Bash: 使用文件名的一部分对查找结果进行排序
Bash: sort find results using part of a filename
我在建筑物中设置了 3 个网络摄像头,将静止图像上传到网络服务器。我正在使用 ffmpeg 将 jpg 编码为 mp4 视频。
目录设置如下:
Cam1/201504
Cam1/201505
Cam2/201504
Cam2/201505
Cam3/201504
Cam3/201505
我每年使用以下 bash loop/ffmpeg 参数为每台摄像机制作一个视频。到目前为止效果很好(好吧...除了我的 SSD 性能迅速下降 - 同时进行的 read/write 操作太多?):
find Cam2/2013* -name "*.jpg" -print0 | xargs -0 cat | ffmpeg -f image2pipe -framerate 30 -vcodec mjpeg -i - -vcodec libx264 -profile:v baseline -level 3.0 -movflags +faststart -crf 19 -pix_fmt yuv420p -r 30 "Cam2-2013-30fps-19crf.mp4"
各个文件的命名方式如下(混淆了 ffmpeg 的内置文件排序器):
Cam1_2015052413543201.jpg
Cam1_2015052413544601.jpg
Cam2_2015052413032601.jpg
Cam2_2015052413544901.jpg
我现在需要为所有 3 个摄像头制作一整年的视频,按时间戳排序。为此,我需要根据下划线后的文件名段对查找结果进行排序。
通过管道将查找输出传递给什么来完成此操作?例如,上面的文件将按如下顺序排列:
Cam2_2015052413032601.jpg
Cam1_2015052413543201.jpg
Cam1_2015052413544601.jpg
Cam2_2015052413544901.jpg
非常感谢任何帮助!
使用 sort
和 --key
选项。有关密钥格式的详细信息,请参阅 sort
的手册页。通常(对于 coreutils 和 BSD sort
)它应该是 F[.C][OPTS][,F[.C][OPTS]]
,其中 F
是字段,C
是字符位置。这里你想从第一个字段的第 5 个字符开始排序,所以 --key=1.5
会做:
> echo -e 'Cam1_2015052413543201.jpg\nCam1_2015052413544601.jpg\nCam2_2015052413032601.jpg\nCam2_2015052413544901.jpg' | sort --key=1.5
Cam2_2015052413032601.jpg
Cam1_2015052413543201.jpg
Cam1_2015052413544601.jpg
Cam2_2015052413544901.jpg
在这里,您似乎不仅在 find
的输出中有基本名称,而且在前面带有路径段的相对路径,如 Cam1/201505/
,但您仍然可以计算字符数,因此可以编写适当的keydef。例如,假设上例中图像的路径是
Cam1/201505/Cam1_2015052413543201.jpg
Cam1/201505/Cam1_2015052413544601.jpg
Cam2/201505/Cam2_2015052413032601.jpg
Cam2/201505/Cam2_2015052413544901.jpg
然后
sort --key=1.17
会给你正确的顺序
Cam2/201505/Cam2_2015052413032601.jpg
Cam1/201505/Cam1_2015052413543201.jpg
Cam1/201505/Cam1_2015052413544601.jpg
Cam2/201505/Cam2_2015052413544901.jpg
排序
sort -t '_' -nk2
-t '_'
# 指定字段分隔符应该是下划线
-nk2 #从第二个字段开始排序(下划线之后)..n
按照数值排序value/timestamp
产出
Cam2_2015052413032601.jpg
Cam1_2015052413543201.jpg
Cam1_2015052413544601.jpg
Cam2_2015052413544901.jpg
管道排序以查找类似
的命令
sort -t '_' -nk2 --files0-from=-
我在建筑物中设置了 3 个网络摄像头,将静止图像上传到网络服务器。我正在使用 ffmpeg 将 jpg 编码为 mp4 视频。
目录设置如下:
Cam1/201504
Cam1/201505
Cam2/201504
Cam2/201505
Cam3/201504
Cam3/201505
我每年使用以下 bash loop/ffmpeg 参数为每台摄像机制作一个视频。到目前为止效果很好(好吧...除了我的 SSD 性能迅速下降 - 同时进行的 read/write 操作太多?):
find Cam2/2013* -name "*.jpg" -print0 | xargs -0 cat | ffmpeg -f image2pipe -framerate 30 -vcodec mjpeg -i - -vcodec libx264 -profile:v baseline -level 3.0 -movflags +faststart -crf 19 -pix_fmt yuv420p -r 30 "Cam2-2013-30fps-19crf.mp4"
各个文件的命名方式如下(混淆了 ffmpeg 的内置文件排序器):
Cam1_2015052413543201.jpg
Cam1_2015052413544601.jpg
Cam2_2015052413032601.jpg
Cam2_2015052413544901.jpg
我现在需要为所有 3 个摄像头制作一整年的视频,按时间戳排序。为此,我需要根据下划线后的文件名段对查找结果进行排序。
通过管道将查找输出传递给什么来完成此操作?例如,上面的文件将按如下顺序排列:
Cam2_2015052413032601.jpg
Cam1_2015052413543201.jpg
Cam1_2015052413544601.jpg
Cam2_2015052413544901.jpg
非常感谢任何帮助!
使用 sort
和 --key
选项。有关密钥格式的详细信息,请参阅 sort
的手册页。通常(对于 coreutils 和 BSD sort
)它应该是 F[.C][OPTS][,F[.C][OPTS]]
,其中 F
是字段,C
是字符位置。这里你想从第一个字段的第 5 个字符开始排序,所以 --key=1.5
会做:
> echo -e 'Cam1_2015052413543201.jpg\nCam1_2015052413544601.jpg\nCam2_2015052413032601.jpg\nCam2_2015052413544901.jpg' | sort --key=1.5
Cam2_2015052413032601.jpg
Cam1_2015052413543201.jpg
Cam1_2015052413544601.jpg
Cam2_2015052413544901.jpg
在这里,您似乎不仅在 find
的输出中有基本名称,而且在前面带有路径段的相对路径,如 Cam1/201505/
,但您仍然可以计算字符数,因此可以编写适当的keydef。例如,假设上例中图像的路径是
Cam1/201505/Cam1_2015052413543201.jpg
Cam1/201505/Cam1_2015052413544601.jpg
Cam2/201505/Cam2_2015052413032601.jpg
Cam2/201505/Cam2_2015052413544901.jpg
然后
sort --key=1.17
会给你正确的顺序
Cam2/201505/Cam2_2015052413032601.jpg
Cam1/201505/Cam1_2015052413543201.jpg
Cam1/201505/Cam1_2015052413544601.jpg
Cam2/201505/Cam2_2015052413544901.jpg
排序
sort -t '_' -nk2
-t '_'
# 指定字段分隔符应该是下划线
-nk2 #从第二个字段开始排序(下划线之后)..n
按照数值排序value/timestamp
产出
Cam2_2015052413032601.jpg
Cam1_2015052413543201.jpg
Cam1_2015052413544601.jpg
Cam2_2015052413544901.jpg
管道排序以查找类似
的命令sort -t '_' -nk2 --files0-from=-