为什么 `ls` 命令会这样对文件进行排序?

为什么 `ls` 命令会这样对文件进行排序?

当我尝试对 ls 命令进行逆向工程时,我发现了一个有趣的行为。当我创建 3 个文件、、foo.pngfoopa.pngfooqa.png,ls 将它们排序为foopa.png、、foo.pngfooqa.png。我也尝试使用 .gif 扩展名,似乎当 p 和 q 被扩展名的第一个字母和字母表中的下一个字母替换时会发生这种情况;所以在 的情况下。G如果是 g 和 h。(fooga.gif,那么foo.gif,那么fooha.gif

为什么要这样排列输出?

答案1

这取决于您所在地区的排序顺序:

>LANG=en_IE.UTF-8 ls -1 foo*
foopa.png
foo.png
fooqa.png

>LANG=C ls -1 foo* 
foo.png
foopa.png
fooqa.png

您还可以使用 LC_COLLATE 变量代替 LANG,并使用 POSIX 区域设置代替 C 区域设置。

C 排序顺序完全是按字母顺序排列的(ASCII 顺序)。其他排序顺序(如英语)可能将空格和特殊字符(如点)视为分隔符,并单独处理“单词”或忽略这些分隔符(此处似乎是这种情况)。

请注意,非 UTF-8 语言环境也使用字母 ASCII 进行排序:

>LANG=en_IE ls -1 foo*
foo.png
foopa.png
fooqa.png

经过进一步挖掘,似乎忽略标点符号是支持 Unicode 的语言环境(例如)的常见特征*.UTF-8

相关内容