Ls

使 ls 進行合理的排序,但不將希臘字元列印為“??”

  • March 9, 2021

假設我在一個目錄中有以下文件

_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-8LC_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更改排序順序即可。

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