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
.
排序
ls
取決於您的語言環境設置,但是,不幸的是,使用ls -v
and時不會考慮這一點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
’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)
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
我們是否使用
oe
glob 限定符通過評估 xpression 將名稱重寫為大寫以l
進行o
rdering 。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é