使 ls 進行合理的排序,但不將希臘字元列印為“??”
假設我在一個目錄中有以下文件
_y a b c x z β
以下命令按照上帝的意圖按上述順序列出它們:
perl -e '@files = <*>; print join(" ",sort @files)'
這就是我在執行 ls 時想要發生的事情。也就是說,我希望它們都正確顯示,包括帶有希臘測試版的那個,並且我還希望它們以某種合理的順序顯示,例如這個,其中文件名中較早的字元總是比後面的更重要一,如果他們不同。
ls 在我的 ubuntu 系統上的預設行為是顯示這個:
a b c x _y z β
這是因為它試圖對人類友好,而不是將下劃線視為一個角色。我不想要那種行為。
我可以
alias ls='LANG=C ls'
,這使得排序不支持區域設置。但是,輸出是這樣的:
_y a b c x z ??
所以現在希臘字母沒有正確顯示。我想這個環境變數使 ls 將所有內容解釋為單字節 ascii 程式碼,然後 beta 可能是一些不可列印字元的兩字節組合。
有什麼方法可以讓 ls 做我想做的事嗎?
如果您的語言環境是
en_US.UTF-8
並LC_ALL=C ls
為您提供所需的訂單,那麼LC_COLLATE=C ls
應該給你你想要的順序並顯示
β
為β
.設置
LANG
為任何 UTF-8 語言環境應顯示β
為β
. 您正在使用en_US.UTF-8
,因此無需更改LANG
。其中一條評論建議“設置為
LANG
希臘語和”。你的嘗試是,但它沒有奏效,因為:LC_COLLATE``C``LC_COLLATE="C" LANG="el_EL.UTF-8" ls
- 希臘語言環境是
el_GR.UTF-8
,不是el_EL.UTF-8
;- 即使我錯了並且
el_EL.UTF-8
存在,您(您的作業系統)也可能從未從模板中為其生成本地化文件。可能您還沒有為
el_GR.UTF-8
任何一個生成文件。要獲得它們,您需要編輯/etc/locale.gen
並取消註釋el_GR.UTF-8
,然後執行sudo locale-gen
。然後LC_COLLATE=C LANG=el_GR.UTF-8 ls
就會工作。但同樣,您不必這樣做,您en_US.UTF-8
的足以顯示β
為β
. 您只需要LC_COLLATE=C
更改排序順序即可。