【问题标题】:Version sort on FreeBSD?FreeBSD 上的版本排序?
【发布时间】:2014-11-22 01:39:22
【问题描述】:

我必须在 FreeBSD 10 系统上以正确的顺序对数千个文件进行排序。输出将通过管道传输到另一个程序中。

这是我想要的结果:

video_title.mp4Frag1Num0.ts
video_title.mp4Frag2Num1.ts
video_title.mp4Frag3Num2.ts
video_title.mp4Frag4Num3.ts
video_title.mp4Frag5Num4.ts
video_title.mp4Frag6Num5.ts
video_title.mp4Frag7Num6.ts
video_title.mp4Frag8Num7.ts
video_title.mp4Frag9Num8.ts
video_title.mp4Frag10Num9.ts
video_title.mp4Frag11Num10.ts
video_title.mp4Frag12Num11.ts
video_title.mp4Frag13Num12.ts
video_title.mp4Frag14Num13.ts
video_title.mp4Frag15Num14.ts
video_title.mp4Frag16Num15.ts
video_title.mp4Frag17Num16.ts
video_title.mp4Frag18Num17.ts
video_title.mp4Frag19Num18.ts
video_title.mp4Frag20Num19.ts
video_title.mp4Frag21Num20.ts
...

如果我在 FreeBSD 系统的文件目录中运行ls -1 | sort --version-sort,结果如下:

video_title.mp4Frag100Num99.ts
video_title.mp4Frag101Num100.ts
video_title.mp4Frag102Num101.ts
video_title.mp4Frag103Num102.ts
video_title.mp4Frag104Num103.ts
video_title.mp4Frag105Num104.ts
video_title.mp4Frag106Num105.ts
video_title.mp4Frag107Num106.ts
video_title.mp4Frag108Num107.ts
video_title.mp4Frag109Num108.ts
video_title.mp4Frag10Num9.ts
video_title.mp4Frag110Num109.ts
video_title.mp4Frag111Num110.ts
video_title.mp4Frag112Num111.ts
video_title.mp4Frag113Num112.ts
video_title.mp4Frag114Num113.ts
video_title.mp4Frag115Num114.ts
video_title.mp4Frag116Num115.ts
video_title.mp4Frag117Num116.ts
video_title.mp4Frag118Num117.ts
...

如果我将文件目录复制到 Debian Wheezy 系统并运行ls -1 | sort --version-sort,结果是正确的:

video_title.mp4Frag1Num0.ts
video_title.mp4Frag2Num1.ts
video_title.mp4Frag3Num2.ts
video_title.mp4Frag4Num3.ts
video_title.mp4Frag5Num4.ts
video_title.mp4Frag6Num5.ts
video_title.mp4Frag7Num6.ts
video_title.mp4Frag8Num7.ts
video_title.mp4Frag9Num8.ts
video_title.mp4Frag10Num9.ts
video_title.mp4Frag11Num10.ts
video_title.mp4Frag12Num11.ts
video_title.mp4Frag13Num12.ts
video_title.mp4Frag14Num13.ts
video_title.mp4Frag15Num14.ts
video_title.mp4Frag16Num15.ts
video_title.mp4Frag17Num16.ts
video_title.mp4Frag18Num17.ts
video_title.mp4Frag19Num18.ts
video_title.mp4Frag20Num19.ts
...

如何在 FreeBSD 系统上正确排序文件?

【问题讨论】:

    标签: regex sorting freebsd


    【解决方案1】:

    GNU coreutils 排序和 FreeBSD 排序对于版本排序有不同的概念。

    GNU 的信息文档说:

    --版本排序 按版本名称和编号排序。它的行为类似于标准排序, 除了每个十进制数字序列都以数字方式处理 作为索引/版本号。

    FreeBSD sort 的手册页说:

    -V,--版本排序 对版本号进行排序。输入行被视为文件名 以 PREFIX VERSION SUFFIX 形式,其中 SUFFIX 匹配正则 表达式“(.([A-Za-z~][A-Za-z0-9~]*)?)*”。

    记住那个正则表达式;我会在一分钟内回复它。

    BSD 手册页没有说明,我已经通过阅读源代码验证了这一点,它会使用前缀+版本作为主键,后缀作为辅助键进行排序。这意味着

    prog-10.c
    prog-11.c
    prog-9.cc
    prog-9.c
    

    将版本排序为

    prog-9.c
    prog-9.cc
    prog-10.c
    prog-11.c
    

    这对你意味着什么?对于像video_title.mp4Frag115Num114.ts 这样的文件名,它认为后缀是.mp4Frag115Num114.ts。它将首先按前缀之前的部分排序(在您的情况下,始终为video_title),然后按字典顺序按后缀排序。坚果。

    解决方法:

    • 从端口安装coreutils,这会将GNU排序安装为/usr/local/bin/gsort
    • 使用@triplee 的答案准确指定您希望对哪些字段进行数字排序。

      sort -t g -n -k2

      g 设置为字段分隔符并在第二个字段上按数字排序。

    • 将输入更改为sort,这样您关心的部分就不会被视为后缀,例如

      sed 's/Frag/Frag-/'|sort --version-sort|sed 's/Frag-/Frag/'

    【讨论】:

      【解决方案2】:

      如果只是一次性使用这些文件,

      sort -t g -k2n
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-02
        • 2013-06-20
        • 2018-05-08
        • 2018-02-06
        • 2011-11-22
        • 1970-01-01
        • 2016-02-17
        • 2017-03-16
        相关资源
        最近更新 更多