Sort files numerically in bash

2020-01-31 03:55发布

I need to sort .flv files numerically and i was able to do it with the following command:

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

but with many files(hundreds) it's not sorting correctly.

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

but the strange this is, if i'm ruining the command without "*.flv" it's working. i could use just ls but i have other file types in the folder.

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

what i've tried so far:

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

3条回答
叼着烟拽天下
2楼-- · 2020-01-31 03:58

to sort numerically after first character, try this :

sort -k1.2n
查看更多
爱情/是我丢掉的垃圾
3楼-- · 2020-01-31 04:05

I would try following code. Works on my testing scenario:

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

The ls lists flv files 1 on each line, sort takes first (and only one) word on each line starting on second character (start of the number). Sorts numerically

查看更多
一纸荒年 Trace。
4楼-- · 2020-01-31 04:16

Given a folder with sequentially named files from 1.flv to 9999.flv

ls -v1 *.flv

will output:

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

From the man page:

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

For brevity, the two flags above can be clubbed together as -v1.

查看更多
登录 后发表回答