这不是问题,但我只是好奇。
为什么程序中文件的字母顺序列表不同?
在我看来,好像每个程序都实现了自己的文件名字母排序方法。也许这些方法源自程序所依赖的库。显然,它们对“_”或“-”等符号的处理方式不同。我认为这些不一致有点奇怪。
以下是示例。我创建了 2 个文件,“flop.png”和“flop_drop.png”。在 BASH shell 中,列表如下:
-rw-rw-r-- 1 pauljohn pauljohn 3547 Apr 1 21:50 flop_drop.jpg
-rw-rw-r-- 1 pauljohn pauljohn 3547 Apr 1 21:50 flop.jpg
然而,在 Nautilus 中,情况却相反
但在 Geeqie 中,我看到的内容与 BASH 中的相同:
UNIX find 程序与 Nautilus 的一致:
$ find . -name "flo*"
./flop.jpg
./flop_drop.jpg
我见过各种类似的情况,但我并不完全理解这种模式。我增加了各种变化,BASH 中的 ls 输出表明它包括按字母顺序排序的后缀:
-rw-rw-r-- 1 pauljohn pauljohn 3547 Apr 1 21:50 flop_drop.jpg
-rw-rw-r-- 1 pauljohn pauljohn 3547 Apr 1 21:50 flop.jpg
-rw-rw-r-- 1 pauljohn pauljohn 3547 Apr 1 22:14 flop_nop.jpg
-rw-rw-r-- 1 pauljohn pauljohn 3547 Apr 1 22:15 flop_qrop.jpg
但 Nautilus 总是先保留“flop.jpg”,无论下划线后面是什么。我发现 Thunar 也是这样。
不过,为了进行比较,我安装了一个名为“gwenview”的图像查看器。在那里,我们得到了完全不同的东西。顺序是
flop_drop.jpg
flop_nop.jpg
flop_qrop.jpg
flop.jpg
对于应该如何做,是否存在不同的思想流派,或者这些只是偶然的差异?
答案1
显然,他们对 LC_COLLATE 环境变量使用了不同的语言环境,该变量定义了“字符串(文件名……)如何按字母顺序排序”(来源)。您可以使用 显示系统可用的语言环境locale -a
。以下示例显示了如何仅更改一个命令的设置(该test
文件包含四个示例文件名),我的方法是尝试一下,并在alias sort="LC_COLLATE=C sort"
必要时定义别名:
> sort test # my system standard is LC_COLLATE=de_DE.UTF-8
flop_drop.jpg
flop.jpg
flop_nop.jpg
flop_qrop.jpg
> LC_COLLATE=C sort test
flop.jpg
flop_drop.jpg
flop_nop.jpg
flop_qrop.jpg
这个答案相关问题对区域设置、它们的定义位置以及如何更改它们进行了很好的概述。
然而,鹦鹉螺号显然有一个漏洞…
编辑
find
似乎忽略了 LC_COLLATE 的手动设置:
> find . -name "flop*" # my system standard is LC_COLLATE=de_DE.UTF-8
./flop.jpg
./flop_drop.jpg
./flop_qrop.jpg
./flop_nop.jpg
> LC_COLLATE=de_DE.UTF-8 find . -name "flop*"
./flop.jpg
./flop_drop.jpg
./flop_qrop.jpg
./flop_nop.jpg
> LC_COLLATE=en_EN.UTF-8 find . -name "flop*"
./flop.jpg
./flop_drop.jpg
./flop_qrop.jpg
./flop_nop.jpg
我完全不知道它为什么会这样表现,特别是因为它的手册页列出了程序使用的 LC_COLLATE。我无话可说了。