Ls

如何讓 ls 先對下劃線字元進行排序?

  • February 7, 2013

如果我想將文件和目錄與同一級別的其他文件和目錄分開,我喜歡能夠使用下劃線前綴命名文件和目錄。例如,在 Windows 和 Mac 上,為文件添加下劃線前綴會將其排序到頂部,位於以字母數字字元開頭的文件之前。

我的Google搜尋發現它與 LC_COLLATE 和我目前的語言環境(en_US)有關。沒關係,雖然我真的不明白為什麼 en_US 沒有按預期排序。

基於ICU Collat​​e 展示站點將語言環境設置為 en_US_POSIX 肯定似乎具有我正在尋找的排序順序(您必須編輯範例數據並添加一些下劃線來測試它)。但我真的不知道如何在我的 Linux shell 中應用它。

理想情況下,我希望能夠在我的 bash 配置中設置一些東西,以便 ls 總是首先對下劃線進行排序。我該怎麼做呢?

如果您無法ls按照您想要的方式進行排序,請嘗試 shell 擴展。

您可以使用文件名模式來執行lsshell 已經排序的文件列表,繞過ls使用的方法。

ls -lf _* [!_]*

假設你有文件

_a a _b b _c c

這就像跑步

ls -lf _a _b _c a b c

解釋:

_*是一個 shell 模式,匹配任何以下劃線開頭的文件名,按字母順序展開。

[!_]*匹配任何以下劃線開頭的文件名,按字母順序展開。

-f告訴ls不要排序,因為外殼已經這樣做了*。*

更多資訊:bash 文件名擴展

如果目前目錄中有目錄,您將需要執行這樣的命令以避免 ls 列出目錄中的文件:

ls -lfd _* [!_]*

如果您不想混合小寫和大寫,請將您的語言環境設置為C,這將按數字順序接收字元。_介於大寫和小寫之間。

$ LC_COLLATE=C ls    
BAR  FOO  _score  _under  hello  world
$ LC_COLLATE=en_US ls                    
BAR  FOO  hello  _score  _under  world

區域設置LC_MESSAGES(錯誤消息的語言)、LC_CTYPE(字元集)和LC_TIME(日期和時間格式)非常有用。LC_COLLATE並且LC_NUMERIC通常比它們的價值更麻煩,我不建議設置它們。正確的字典排序比LC_COLLATE應該指定的要復雜得多,當您在正則表達式中使用字元範圍時,它可能會導致各種奇怪的行為。LC_NUMERIC主要是裝飾性的,除非出現可怕的錯誤,因為某些程序生成了一個帶有小數分隔符的數字,而不是..

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