lsort不能正确地对文件名进行正确排序

时间:2020-05-13 19:08:43

标签: tcl glob

我在这样的存储库文件夹中捕获图片列表:

foreach image [lsort [glob -nocomplain -directory $image_path -type f *]] {
    puts $image
}

由于lsort,所有图像重新归类,但有一些图像根本没有被归类,我无法弄清原因。

从文件夹返回的顺序为:

Repository/Unsorted/3.jpg
Repository/Unsorted/30.jpg
Repository/Unsorted/33.jpg
Repository/Unsorted/6.jpg
Repository/Unsorted/9.jpg 

预期

Repository/Unsorted/3.jpg
Repository/Unsorted/6.jpg
Repository/Unsorted/9.jpg 
Repository/Unsorted/30.jpg
Repository/Unsorted/33.jpg

更新: 当我使用-dictionary开关时,它将返回正确的顺序。有人可以详细说明为什么吗?

foreach image [lsort -dictionary [glob -nocomplain -directory $image_path -type f *]] {
    puts $image
}

1 个答案:

答案 0 :(得分:0)

lsort命令有几种方法可以确定元素的顺序。

  • -ascii(由于各种原因而为默认模式,略有误名)仅使用两个字符串中每对字符的数字顺序,即字符串中的字符顺序。如果使用C strcmp(),这就是您所期望的……如果那是Unicode感知的。

  • -dictionary是相同的……除了字符串中的数字顺序(因此,字符09不是 {{1 }},因此不会将任何负数作为数字进行比较。这样给出的排序感觉更像是字典中的排序;它专门用于在Tk的文件选择对话框中产生令人愉悦的文件名顺序。

  • ,为完整起见,--integer将字符串分别解析为整数和浮点数,然后对其进行排序,而-real可让您提供自己的排序命令(速度较慢,但​​完全可以控制)。

Tcl知道按什么顺序对值进行排序的唯一原因是因为您告诉了它。

因此,在比较-commandRepository/Unsorted/3.jpg时,在Repository/Unsorted/30.jpg模式下,-ascii(Unicode U + 00002E)在.(Unicode U + 000030)之前),而在0模式下,-dictionary3数字序列被解析为整数并以这种方式进行比较(因为之前的非数字部分是相同的)。