Windows 的排序顺序在我的脑海中根深蒂固。不幸的是,Windows 并没有提供一种简单的方法来更改它。
有没有办法使用unix工具模拟这种排序顺序?
每个都是文件名的示例
{"Ie4 01", "Ie4!01", "Ie4_01", "Ie4_128", "Ie5", "Ie6", "Ie401sp2","Ie501sp2"}
正确的排序顺序
Ie4 01
Ie4!01
Ie4_01
Ie4_128
Ie5
Ie6
Ie401sp2
Ie501sp2
答案1
如果有人想要像 Windows 那样分离文件夹和文件,您可以这样做:
ls -d */ -1 | sort -V
ls -p | grep -v / | sort -V
答案2
GNU sort 的版本 sort ( -V
) 似乎提供了该输出:
~ printf "%s\n" "Ie5" "Ie6" "Ie4 01" 'Ie4!01' "Ie4_01" "Ie4_128" "Ie401sp2" "Ie501sp2" |
sort -V
Ie4 01
Ie4!01
Ie4_01
Ie4_128
Ie5
Ie6
Ie401sp2
Ie501sp2
答案3
如果您不特别关心特殊字符的顺序,那么zsh
的数字排序 glob 限定符会很接近:
设置
$ touch "Ie5" "Ie6" "Ie4 01" 'Ie4!01' "Ie4_01" "Ie4_128" "Ie401sp2" "Ie501sp2"
$ mkdir Foo Quux Ie7bar
仅限 zsh
$ print -l *(n/) *(n^/)
Foo
Ie7bar
Quux
Ie4 01
Ie4_01
Ie4!01
Ie4_128
Ie5
Ie6
Ie401sp2
Ie501sp2
与 LS
$ ls -1df *(n/) *(n^/)
Foo
Ie7bar
Quux
Ie4 01
Ie4_01
Ie4!01
Ie4_128
Ie5
Ie6
Ie401sp2
Ie501sp2
标志ls
是:
- 强制单列输出(
-1
)——只是为了方便查看 - 不进入目录 (
-d
) - 不对传入列表进行排序 (
-f
或-U
)
zsh glob 限定符表示:
*(n/)
- 展开到目录列表/
,按数字排序*(n^/)
- 展开到项目列表不是^
目录,按数字排序
我提到 zsh 解决方案只是因为您可以更轻松地操作结果,而不必担心引用文件名或用 null 分隔它们。例如:
$ mine=( *(/n) *(n^/) )
$ for file in "${mine[@]}"; do print -l "$file"; done
Foo
Ie7bar
Quux
Ie4 01
Ie4_01
Ie4!01
Ie4_128
Ie5
Ie6
Ie401sp2
Ie501sp2
$ print -l "${mine[-1]}"
Ie501sp2