在bash中按数字顺序对文件进行排序。

15

我需要按数字顺序排序.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

2
什么问题?e696.flv在正确的位置吗? - dogbane
你尝试过直接执行 "ls *.flv | sort -f | tail -n 20" 吗? - m1k3y3
@m1k3y3,如果文件名中的数字位数是变化的,那么它就不能正常工作。 - Kamil Šrot
ls *.flv | sort -f 跳过文件...我可以只使用 ls,但是我在文件夹中有其他文件类型。 - Crazy_Bash
3个回答

28

我会尝试以下代码。在我的测试情况下有效:

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

ls命令每行列出一个flv文件,sort命令对每行的第二个字符(数字的开头)及以后的内容进行数值排序,并提取每行的第一个单词。


16

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

ls -v1 *.flv

将输出:

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

来自man用法说明

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

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


它非常有效!我一直在尝试各种排序选项,但-v1效果很好。-v1是什么意思?查看manpage时,它说“按版本排序”..不确定我理解了什么意思。谢谢。 - Molly_K
@Molly_K:请查看更新后的答案;versions只是数字,例如1.92.010.2,指定-v会强制按数字顺序排序,而不是按字符串排序。 - ccpizza

5
要按第一个字符进行数字排序,请尝试以下操作:
sort -k1.2n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接