设置

设置

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

相关内容