Debian

ls -v(自然數排序)命令將大寫文件/目錄排在非大寫文件/目錄之前

  • February 7, 2022

我希望對數字進行自然排序,但*大寫的文件/目錄未在頂部排序。*那可能嗎?

目前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.

排序ls取決於您的語言環境設置,但是,不幸的是,使用ls -vand時不會考慮這一點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

您總是可以使用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)

ls不進行排序(並按照 glob 擴展給出的順序列出文件)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 限定符通過評估 xpression 將名稱重寫為大寫以l進行ordering 。e``REPLY=$REPLY:l e

使用 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é

引用自:https://unix.stackexchange.com/questions/689652