Bash:使用文件名的一部分对查找结果进行排序

时间:2015-11-13 01:21:53

标签: bash ffmpeg find webcam cat

我在建筑物中设置了3个网络摄像头,将静态图像上传到网络服务器。我正在使用ffmpeg将jpgs编码为mp4视频。

目录设置如下:

Cam1/201504
Cam1/201505
Cam2/201504
Cam2/201505
Cam3/201504
Cam3/201505

我正在使用以下bash循环/ ffmpeg参数每年为每个摄像头制作一个视频。到目前为止,这种方法运行良好(除了我的SSD在性能上迅速降低 - 同时进行多次读/写操作?):

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

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

排序

sort -t '_' -nk2

-t '_'#指定字段分隔符应为下划线

-nk2#从第二个字段开始排序(在下划线之后).. n根据数值/时间戳排序

输出

Cam2_2015052413032601.jpg
Cam1_2015052413543201.jpg
Cam1_2015052413544601.jpg
Cam2_2015052413544901.jpg

管道排序以找到类似

的命令
sort -t '_' -nk2 --files0-from=-

答案 1 :(得分:2)

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