【问题标题】:Bash: sort find results using part of a filename [duplicate]Bash:使用文件名的一部分对查找结果进行排序[重复]
【发布时间】:2016-02-14 13:04:07
【问题描述】:

我在一栋建筑物中设置了 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 台摄像机上创建一整年的视频,按时间戳排序。为此,我需要按下划线后的文件名段对查找结果进行排序。

我应该用什么管道来完成这个 find 输出?例如,上面的文件将按如下顺序排列:

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

非常感谢任何帮助!

【问题讨论】:

    标签: bash ffmpeg find webcam cat


    【解决方案1】:

    排序

    sort -t '_' -nk2
    

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

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

    输出

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

    管道排序以查找类似命令

    sort -t '_' -nk2 --files0-from=-
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 这适用于较短的列表,但我使用的是 xargs,因为我遇到了大型列表的“/bin/cat:参数列表太长”。我如何将它集成到使用 xargs 编写的命令中?
      • find blah blah | sort blah blah | xargs blah blah。那有什么问题?顺便说一句,另一个答案比我的好。
      • 因为这不应用排序。我想我不太了解 xargs 。这是我的命令:find */201111/*20111130* -name "*.jpg" -print0 | sort -t '_' -nk2 | 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 "output.mp4"
      • 您不能使用find ... -print0xargs -0,当您在两者之间粘贴sort 时。 sort 依赖换行符。
      • $ find */201111/* -name "*.jpg" | sort -t '_' -nk2 -bash: /usr/bin/find: 参数列表太长
      猜你喜欢
      • 2018-01-08
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 2014-05-10
      • 1970-01-01
      相关资源
      最近更新 更多