如何讓 ls 先對下劃線字元進行排序?
如果我想將文件和目錄與同一級別的其他文件和目錄分開,我喜歡能夠使用下劃線前綴命名文件和目錄。例如,在 Windows 和 Mac 上,為文件添加下劃線前綴會將其排序到頂部,位於以字母數字字元開頭的文件之前。
我的Google搜尋發現它與 LC_COLLATE 和我目前的語言環境(en_US)有關。沒關係,雖然我真的不明白為什麼 en_US 沒有按預期排序。
基於ICU Collate 展示站點將語言環境設置為 en_US_POSIX 肯定似乎具有我正在尋找的排序順序(您必須編輯範例數據並添加一些下劃線來測試它)。但我真的不知道如何在我的 Linux shell 中應用它。
理想情況下,我希望能夠在我的 bash 配置中設置一些東西,以便 ls 總是首先對下劃線進行排序。我該怎麼做呢?
如果您無法
ls
按照您想要的方式進行排序,請嘗試 shell 擴展。您可以使用文件名模式來執行
ls
shell 已經排序的文件列表,繞過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
主要是裝飾性的,除非出現可怕的錯誤,因為某些程序生成了一個帶有小數分隔符的數字,而不是.
.