![我可以使用什么命名约定来确保使用 ls 文件名按一致的顺序排序?](https://linux22.com/image/202088/%E6%88%91%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E4%BB%80%E4%B9%88%E5%91%BD%E5%90%8D%E7%BA%A6%E5%AE%9A%E6%9D%A5%E7%A1%AE%E4%BF%9D%E4%BD%BF%E7%94%A8%20ls%20%E6%96%87%E4%BB%B6%E5%90%8D%E6%8C%89%E4%B8%80%E8%87%B4%E7%9A%84%E9%A1%BA%E5%BA%8F%E6%8E%92%E5%BA%8F%EF%BC%9F.png)
我试图为一组文件制定一个命名约定,以便它们始终按一致的顺序排序,而不需要任何特殊选项,但我很难实现这一点。
如果我有以下文件名:A.jpg
, A1.jpg
, A-1.jpg
, A_1.jpg
,当我ls
从没有选项的命令行运行时(手册页说将“按字母顺序对条目进行排序”),我会得到以下顺序:
A-1.jpg, A_1.jpg, A1.jpg, A.jpg
我不清楚这实际上是如何排序的,因为“-”、“_”和“1”的 ASCII 值为 45、95 和 49,因此假设它对扩展名之前的所有内容进行排序,则这不是正确的顺序。此外,如果它包含“.”即 ASCII 值 46,因此第二个字符值将是 45、95、49、46。
如果没有扩展名,例如A
, A1
, A-1
, 然后A_1
返回ls
此顺序:
A, A-1, A_1, A1
在这种情况下,第二个字符的 ASCII 值为 NULL、45、95、48,其中还似乎没有任何顺序,但甚至也没有与扩展名丢失相同的顺序。
另一方面,如果我查看 GNOME 文件管理器中的目录,我会得到以下命令:
A.jpg, A1.jpg, A-1.jpg, A_1.jpg
这也是我得到的输出ls -v
,手册页显示“文本中(版本)数字的自然排序”。在这种情况下,它似乎首先不使用数字进行排序,然后是纯数字,然后按 ASCII 顺序在数字前添加前缀。
我想如果我能理解ls
当存在非字母字符时实际上如何“按字母顺序”对条目进行排序将会有很大帮助。从我的简单测试来看,它显然也不是 ASCII 值顺序,这正是我所期望的,甚至不清楚点和扩展名如何融入整个事物。在做什么ls
???
更新:我按照显示顺序放置了一些文件名以及ls
下面的十六进制 ASCII 值:
A 0x41
A-1 0x41 0x2D
A_1 0x41 0x5F
A1 0x41 0x31
A-1.jpg 0x41 0x2D 0x31 0x2E 0x6A 0x70 0x67
A_1.jpg 0x41 0x5F 0x31 0x2E 0x6A 0x70 0x67
A1.jpg 0x41 0x31 0x2E 0x6A 0x70 0x67
AB 0x41 0x42
AB.jpg 0x41 0x42 0x2E 0x6A 0x70 0x67
A.jpg 0x41 0x2E 0x6A 0x70 0x67
更新2:针对评论,输出为type -a ls
:
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
ls is /bin/ls
LC_COLLATE 未设置。
$ set | grep LC_COLLATE
$ echo $LC_COLLATE
$
答案1
考虑到您使用 ls 和可变长度/分隔文件名指出的不确定性,使用仅包含字母数字字符的固定宽度格式可能是有意义的。根据您计划拥有的文件数量,这可能包括用于描述性名称和索引的固定宽度字段。
|名称字段(10 位数字,'x' 扩展)|索引字段(6 位,'0' 扩展)| '.' |文件扩展名(3 位数字)|
例如
xxxsealion000001.jpg
xxxxxxxcat000001.jpg
xxxxxxxcat009000.jpg
如果不了解更多关于类别的相对大小的信息,我无法做得更好,但是您显然可以调整上面的格式以拥有更多的索引空间或更多的描述空间(或者通过使固定宽度更长来获得更多的索引空间或更多的描述空间)。要使较长的单词在最后用“0”填充描述(“_”也对我有用,但与我答案的第一部分相反),为了确保较长的单词首先用“z”填充它们