【问题标题】:Sort files numerically in bash在bash中对文件进行数字排序
【发布时间】:2012-11-01 21:25:25
【问题描述】:

我需要对 .flv 文件进行数字排序,我可以使用以下命令来完成:

ls *\.flv | sort --version-sort -f

但是有很多文件(数百个),它的排序不正确。

ls *\.flv | sort --version-sort -f | tail -n 20
e680.flv
e681.flv
e682.flv
e683.flv
e684.flv
e685.flv
e686.flv
e687.flv
e688.flv
e689.flv
e690.flv
e691.flv
e692.flv
e693.flv
e694.flv
e695.flv
**e696.flv**
s572.flv
s602.flv
s654.flv

但奇怪的是,如果我在没有"*.flv" 的情况下破坏了命令,它就可以工作。 我可以只使用 ls 但我在文件夹中有其他文件类型。

ls | sort --version-sort -f | tail -n 20
e680.flv
e681.flv
e682.flv
e683.flv
e684.flv
e685.flv
e686.flv
e687.flv
e688.flv
e689.flv
e690.flv
e691.flv
e692.flv
e693.flv
e694.flv
e695.flv
e696.flv

到目前为止我已经尝试过:

    ls | sort --version-sort -f | grep "flv"
    ls *.flv | sort --version-sort -f
    ls *\.flv | sort --version-sort -f
    ls *.flv | sort -f

【问题讨论】:

  • 有什么问题? e696.flv 是在正确的地方,对吧?
  • 您是否尝试简单地执行“ls *.flv | sort -f | tail -n 20”
  • @m1k3y3 它不适用于更改文件名中的位数
  • ls *.flv | sort -f 跳过文件...我可以只使用 ls 但我在文件夹中有其他文件类型。

标签: linux bash sorting ls


【解决方案1】:

我会尝试以下代码。适用于我的测试场景:

ls -1 *\.flv | sort -n -k1.2

ls 在每一行列出 flv 文件 1,sort 从第二个字符(数字的开头)开始在每行中获取第一个(也是唯一一个)单词。按数字排序

【讨论】:

    【解决方案2】:

    给定一个文件夹,其中包含从1.flv9999.flv 顺序命名的文件

    ls -v1 *.flv
    

    将输出:

    1.flv
    2.flv
    ...
    10.flv
    ...
    90.flv
    ...
    100.flv
    101.flv
    ...
    9999.flv
    

    来自man page

        -v     natural sort of (version) numbers within text
        -1     list one file per line
    

    为简洁起见,上面的两个标志可以合并为-v1

    【讨论】:

    • 效果惊人!我一直在尝试使用 sort 的所有类型选项,但 -v1 效果很好。 -v1 是什么意思?查看联机帮助页时,它显示“按版本排序”.. 不确定我是否理解这意味着什么。谢谢。
    • @Molly_K:查看更新的答案; versions 只是数字,例如1.92.010.2 并指定 -v 会强制它们按数字排序,而不是按字符串排序。
    【解决方案3】:

    要在第一个字符之后按数字排序,试试这个:

    sort -k1.2n
    

    【讨论】:

      猜你喜欢
      • 2015-11-13
      • 1970-01-01
      • 2016-02-27
      • 2015-06-29
      • 2011-05-18
      • 2021-02-07
      • 2021-10-28
      • 2014-09-01
      • 2010-12-17
      相关资源
      最近更新 更多