![如何自定义字符排序顺序?](https://linux22.com/image/102830/%E5%A6%82%E4%BD%95%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%97%E7%AC%A6%E6%8E%92%E5%BA%8F%E9%A1%BA%E5%BA%8F%EF%BC%9F.png)
如何在 Linux 中设置字符的字符顺序/优先级?
我目前正在使用命令来测试这一点,如下所示:
ls -al --group-directories-first
假设我有以下文件:
a
b
c
A
B
C
.a
.b
.c
.A
.B
.C
ls 的默认输出是这样的:
-rw-r--r-- 1 username username 0 Jan 11 07:18 a
-rw-r--r-- 1 username username 0 Jan 11 07:55 .a
-rw-r--r-- 1 username username 0 Jan 11 07:18 A
-rw-r--r-- 1 username username 0 Jan 11 07:55 .A
-rw-r--r-- 1 username username 0 Jan 11 07:18 b
-rw-r--r-- 1 username username 0 Jan 11 07:55 .b
-rw-r--r-- 1 username username 0 Jan 11 07:18 B
-rw-r--r-- 1 username username 0 Jan 11 07:55 .B
-rw-r--r-- 1 username username 0 Jan 11 07:18 c
-rw-r--r-- 1 username username 0 Jan 11 07:55 .c
-rw-r--r-- 1 username username 0 Jan 11 07:18 C
-rw-r--r-- 1 username username 0 Jan 11 07:55 .C
我想要的输出顺序:
-rw-r--r-- 1 username username 0 Jan 11 07:55 .A
-rw-r--r-- 1 username username 0 Jan 11 07:55 .a
-rw-r--r-- 1 username username 0 Jan 11 07:55 .B
-rw-r--r-- 1 username username 0 Jan 11 07:55 .b
-rw-r--r-- 1 username username 0 Jan 11 07:55 .C
-rw-r--r-- 1 username username 0 Jan 11 07:55 .c
-rw-r--r-- 1 username username 0 Jan 11 07:18 A
-rw-r--r-- 1 username username 0 Jan 11 07:18 a
-rw-r--r-- 1 username username 0 Jan 11 07:18 B
-rw-r--r-- 1 username username 0 Jan 11 07:18 b
-rw-r--r-- 1 username username 0 Jan 11 07:18 C
-rw-r--r-- 1 username username 0 Jan 11 07:18 c
我尝试过的事情.bashrc
:
export LC_ALL="C" #Did not work
export LC_COLLATE="en_US.UTF-8" #Did not work
export LC_LANG="C" #Did not work
export LC_COLLATE="C" #Did not work
那么,我如何制定自己的自定义字符顺序/优先级?
谢谢
答案1
看来该sort
命令可以提供一些帮助。
-t, --field-separator=SEP
使用 SEP 代替非空白到空白的转换
-k, --key=POS1[,POS2]
在 POS1(起始点 1)处开始密钥,在 POS2 处结束(默认行尾)
ls -lAr|sort -t . -k2
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:35 a
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:35 b
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:36 c
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:36 d
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:38 A
-rw-r--r-- 1 CRM CCRM 0 Jan 20 10:34 .a
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:36 .A
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:38 .b
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:36 .B
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:36 .C
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:36 .D
答案2
km_KH 区域设置与您要求的内容排序接近,尽管先小写,后大写。 km_KH 语言环境包含在 Centos 7 的标准安装中。因此,可以合理猜测它可能在其他发行版上可用,也许可以通过存储库中的额外软件包来实现。
您可以将此别名定义放入 .bashrc 中:
$ alias l='LC_COLLATE=km_KH ls -lA'
$ touch a b c A B C .a .b .c .A .B .C
$ l
total 0
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 .a
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 .A
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 .b
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 .B
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 .c
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 .C
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 a
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 A
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 b
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 B
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 c
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 C
尽管点文件排在最后,ar_SA 语言环境的排序也接近您要求的排序:
-rw-rw-r-- 1 g greg 0 Nov 8 18:33 A
-rw-rw-r-- 1 g greg 0 Nov 8 18:33 a
-rw-rw-r-- 1 g greg 0 Nov 8 18:33 B
-rw-rw-r-- 1 g greg 0 Nov 8 18:33 b
-rw-rw-r-- 1 g greg 0 Nov 8 18:33 C
-rw-rw-r-- 1 g greg 0 Nov 8 18:33 c
-rw-rw-r-- 1 g greg 0 Nov 8 18:33 .A
-rw-rw-r-- 1 g greg 0 Nov 8 18:33 .a
-rw-rw-r-- 1 g greg 0 Nov 8 18:33 .B
-rw-rw-r-- 1 g greg 0 Nov 8 18:33 .b
-rw-rw-r-- 1 g greg 0 Nov 8 18:33 .C
-rw-rw-r-- 1 g greg 0 Nov 8 18:33 .c
这是一个简单的循环,用于查看每个已安装的语言环境如何对当前目录进行排序:
for a in $(locale -a);do echo $a;LC_COLLATE=$a ls -Al;done|&less
或者您可以使用一些实用技巧,例如: 使用自定义模式排序
这里的排序和连接答案很有趣: http://superuser.com/questions/489275/how-to-do-custom-sorting-using-unix-sort
或者您可以硬着头皮定义自己的区域设置,请参阅http://askubuntu.com/questions/653008/how-to-create-a-new-system-locale