标题是我想要实现的目标的总结,但我会举一个例子来说明我的问题是什么以及我如何尝试解决它。
示例文件夹
假设我在 Linux 系统上有一个文件夹,其中包含以下文件:.a
,,,,,,和。.A
.b
.B
a
A
b
B
图纳尔
当我在我选择的文件管理器 Thunar 中打开文件夹时,文件按以下顺序显示:
.a
.A
.b
.B
a
A
b
B
这是对我有意义的输出;首先是隐藏文件(或目录),然后按字母顺序排序(考虑大小写)。最好将大写文件排在小写文件之前,但这也不算太糟。换句话说,这是我试图用 实现的输出ls
。
ls
当我想通过列出该文件夹的文件时ls
,我得到的结果如下:
$ ls -lA
total 0
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .b
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 b
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 B
这里,隐藏文件没有排到顶部,但文件整体上是按照“合理”的字母顺序排列的。
尝试LC_ALL=C
和LC_COLLATE=C
将隐藏文件排序到顶部的几个解决方案是临时设置LC_ALL
或LC_COLLATE
为C
(我很难看出两者之间的区别,因此非常感谢您的解释):
$ LC_ALL=C ls -lA
total 0
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .b
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 b
$ LC_COLLATE=C ls -lA
total 0
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 .b
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 A
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 B
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 a
-rw-r--r-- 1 lucas lucas 0 Jan 26 14:58 b
如您所见,这确实解决了隐藏文件问题,但是字母排序的行为现在与 Thunar 按字母顺序对文件进行排序的方式不一致。
问题
因此,这引出了一个问题:我如何ls
以与 Thunar 相同的方式进行排序?最好避免通过管道传输ls
到另一个命令(如)sort
,因为我想将这个新命令别名为其"ls"
自身。
如果这不可能的话,我怎样才能让 Thunar 按照对文件进行排序的方式ls
对文件进行排序(LC_ALL=C
/LC_COLLATE=C
方法对我来说似乎足够好了)?
进一步说,我想问一下按字母顺序对文件进行排序时的最佳做法是什么。我刚刚描述的行为在我看来是合理的,但也许事实并非如此?
o+funcname
如果使用 zsh,则可以定义一个与glob 限定符一起使用的通配符排序顺序函数,该函数将t
ail(基名)以 开头的隐藏文件放在首位.
:然后按以下顺序显示当前工作目录aw on olumn
print
中的文件名称:r
1
C
(还请注意
D
otglob 限定符,因此点文件不会被跳过,否则默认情况下会跳过)。使用 GNU 实现
ls
,您可以使用-U
/--sort=none
选项禁用其自身的排序:如果您希望大写字母在小写字母之前,则可以使用丹麦语排序顺序,如下所示:
或者您可以切换到 C 语言环境,该环境通常根据字节值排序,并且
A-Z
ASCII 字符集恰好位于 之前a-z
。对于您的主要问题:好的解决方案可能是创建一个新的
LC_COLLATE
定义(这可能必须在ls
函数中发生,因为有人可以用...调用它LC_ALL=... ls -lA
)。我不知道该怎么做。对于问题的
LC_ALL=C
/LC_COLLATE=C
部分:通常应该没有区别。如果LC_ALL
之前设置为不同的值,则只会有一个区别。它们的作用相同,LC_ALL=C
只是影响更多配置并具有更高的优先级。