ls -v(自然数排序)命令将大写文件/目录排序在非大写文件/目录之前

ls -v(自然数排序)命令将大写文件/目录排序在非大写文件/目录之前

我想要对数字进行自然排序,但是大写的文件/目录未排序在顶部。那可能吗?

目前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'snumericglobsortnglob 限定符来代替。

$ 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

我们是否使用oeglob 限定符将名称重写为l小写,以便o通过e评估REPLY=$REPLY:l expression 进行排序。

对于 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

相关内容