在目录中创建以下文件。
$ touch .a .b a b A B 你好嗎
我的默认ls
顺序忽略了前导点的存在,将它们与其他文件混合在一起。
$ ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
$ LC_COLLATE=C ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
不幸的是,这使得排序顺序区分大小写,即A
和B
普瑞森a
和b
。有没有一种方法在不区分大小写的情况下(A
以及before和)a
先打印点文件?B
b
到目前为止,没有一个答案能完全ls
轻松地复制出功能。可以想象,我可以将其中的一些包装在一个函数中,但这将必须包含一些详细的代码,例如(无参)与提供目录作为参。或如何处理显式-d
标志。
另外,我认为也许会有更好LC_COLLATE
的使用方法。但是,我似乎无法做到这一点。我目前正在使用LC_COLLATE="en_AU.UTF-8"
。我检查了一下/usr/share/i18n/locales/en_AU
(尽管我不确定这是否是正确的文件,因为我看不到任何引用UTF-8
);我发现了以下内容。
LC_COLLATE
copy "iso14651_t1"
END LC_COLLATE
/usr/share/i18n/locales/iso14651_t1
包含copy "iso14651_t1_common"
。最后/usr/share/i18n/locales/iso14651_t1_common
包含
<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .
我删除了这一行,运行sudo locale-gen
,然后重新启动计算机。不幸的是,这并没有改变。
OP与编辑非常接近/usr/share/i18n/locales/iso14651_t1_common
,但诀窍是不删除该行
<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .
而是将其修改为
<U002E> <RES-1>;IGNORE;IGNORE;<U002E> # 47 .
该IGNORE
语句指定句号(又名期间,或字符<U002E>
的字母顺序排序的话时)将被忽略。要使您的点文件排在第一位,请更改IGNORE
为一个在所有其他字符之前的排序符号。归类符号由如下行定义
collating-symbol <something-inside-angle-brackets>
它们是按行的外观排序的
<something-inside-angle-brackets>
在我的副本中iso14651_t1_common
,第一个排序规则符号是<RES-1>
,显示在3458行上。如果文件不同,请使用顺序排序的任何排序规则符号。
<U002E>
之所以有3条IGNORE
陈述,是因为在有联系的情况下可以多次比较字母。要理解这一点,请考虑小写a
和大写A
(它们是一组实际上被比较了四次的字符的一部分):
<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A
进行多轮比较可以使以“ a”和“ A”开头的文件归为一组,因为与<a>
第一次通过时一样,两者都进行了比较,而下一个字母确定了顺序。如果以下所有字母都相同(例如a.txt
和A.txt
),则第三遍将排在a.txt
第一位,因为小写字母的校对符号<MIN>
出现在第3467行,大写字母的校对符号之前<CAP>
(第3488行)。
如果希望每次程序使用来订购字母时首先出现句号LC_COLLATE
,则可以iso14651_t1_common
如上所述进行修改并重建位置文件。但是,如果你想使这一变化只对ls
和无根的访问,可以将原有的语言文件修改之前复制到另一个目录。
我的默认语言环境是en_US,所以我复制en_US
,iso14651_t1
以及iso14651_t1_common
到$HOME/path/to/new/locales
。在那里,我对进行了上述更改,iso14651_t1_common
并将其重命名en_US
为en_DOTFILE
。接下来,我使用编译了en_DOTFILE语言环境
localedef -i en_DOTFILE -f UTF-8 -vc $HOME/path/to/new/locales/en_DOTFILE.UTF-8
要替换默认的ls
顺序,请制作一个名为的BASH脚本ls
:
#!/bin/bash
LOCPATH=$HOME/path/to/new/locales LANG=en_DOTFILE.UTF-8 ls "$@"
将其保存/usr/bin
在路径上之前出现的位置,并使用使其可执行chmod +x ls
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句