我想要对数字进行自然排序,但是大写的文件/目录未排序在顶部。那可能吗?
目前ls -lv
生产:
FOO/
bar/
ZEBRA.x
foo.x
foo-1.x
foo-2.x
foo-10.x
我搞砸了,|sort ...
但(1)我尝试的一切都不起作用,(2)它--color=auto
从我的ls
命令中删除了。我确信颜色有解决方案,但我不知道它是什么。
编辑
在我的测试中,LC_COLLATE=C ls -l
与 执行相同的操作ls -lv
。
答案1
您始终可以使用zsh
'snumericglobsort
或n
glob 限定符来代替。
$ locale title
English locale for Britain
$ print -rC1 -- *(Nn)
bar
FOO
foo-1.x
foo-2.x
foo-10.x
foo.x
ZEBRA.x
$ () { local LC_COLLATE=C; print -rC1 -- *(Nn); }
FOO
ZEBRA.x
bar
foo-1.x
foo-2.x
foo-10.x
foo.x
使用 GNU ls
:
ls -U -ld --color -- *(n)
为了不排序(并按照的 glob 扩展ls
给出的顺序列出文件)。zsh
如果您的语言环境的排序顺序像 C 语言环境中那样区分大小写,您还可以执行以下操作:
$ locale title
ISO/IEC 14652 i18n FDCC-set
$ print -rC1 -- *(Nnoe['REPLY=$REPLY:l'])
bar
FOO
foo-1.x
foo-2.x
foo-10.x
foo.x
ZEBRA.x
我们是否使用oe
glob 限定符将名称重写为l
小写,以便o
通过e
评估REPLY=$REPLY:l
e
xpression 进行排序。
对于 GNU sort
,-V
(用于版本排序)可以与-f
(不区分大小写的匹配)结合使用,但假设文件名不包含换行符,并且仅适用于 ASCII 字母:
$ ls | LC_COLLATE=C sort -Vf
bar
ETE
FOO
foo.x
foo-1.x
foo-2.x
foo-10.x
ZEBRA.x
Á
ÉTÉ
á
été
答案2
排序ls
取决于您的区域设置,但不幸的是,使用ls -v
和时不会考虑这一点sort -V
。
检查LC_COLLATE="C" ls -l
并看到相同的“问题”。
此功能是使用 gnulib 的 filevercmp 函数实现的,该函数有一些值得注意的注意事项。
- LC_COLLATE 被忽略,这意味着“ls -v”和“sort -V”将对非数字前缀进行排序,就像 LC_COLLATE 区域设置类别设置为“C”一样。
这意味着它将按 ASCII 顺序排序。
也可以看看:
https://www.gnu.org/software/coreutils/manual/coreutils.html#Version-sort-ignores-locale
但是,您可以使用例如python
对版本进行排序:
安装natsort
模块,例如如果您已pip
安装:
pip3 install natsort
将以下内容放入 python 脚本中(例如sortv.py
):
#!/usr/bin/env python3
from natsort import humansorted
import sys
for line in humansorted(sys.stdin):
print(line.rstrip())
然后跑ls -1f | python /path/to/sortv.py
。
这并不完美,它不关心目录与文件,它应该只显示你可以做什么。更好的办法是实现整个事情python
而不是管道ls
永远不应该解析它!
例如:
#!/usr/bin/env python3
import os
from natsort import humansorted
for (path, dirs, files) in os.walk('.'):
for d in dirs:
print('\033[94m{}\033[0m'.format(d))
for f in humansorted(f):
print(f)
break