如何使用Tcl根据这些文件的大小对文件进行排序



我有一个文件列表和一个单独的文件大小列表,使用"文件大小<文件名>";。

我被要求根据大小按升序对文件进行排序,然后进一步进行处理。

有人能提供一个我可以遵循的循序渐进的过程吗?

这就是我到目前为止所做的

set direc "<Any direcotry to look files at>"
set folderFiles [glob -directory $direc -nocomplain -type f *.xml]
set fileSizes []
puts "Files to be processed are:"
puts "$folderFiles"
puts "Sizes of files in this order are:"
foreach tempFile $folderFiles {
lappend fileSizes [file size $tempFile]
}
puts $fileSizes
set fileDict [dict create [lindex $folderFiles 0] [lindex $fileSizes 0]]
for {set i 1} {$i < [llength $folderFiles]} {incr i} {
dict lappend fileDict [lindex $folderFiles $i] [lindex $fileSizes $i]
}
puts $fileDict

所以,这给了我一本字典,其中的键->文件和值->文件大小。我只需要根据文件大小的值对这本字典进行排序。

您需要做的第一件事是获取文件名及其大小的列表。你可以把尺寸分开。

set filenames [glob -type f *.foo]; # Or whatever
set sizes [lmap f $filenames {file size $f}]

然后我们对大小进行排序,但返回排序的索引,而不是排序列表。

set indices [lsort -indices -integer $sizes]

现在,我们使用这些索引来构建排序后的文件名:

set filenames [lmap idx $indices {lindex $filenames $idx}]

我们可以将其中一些东西组合成一个辅助程序:

proc SortFilesBySize {filenames} {
set sizes [lmap f $filenames {file size $f}]
return [lmap idx [lsort -indices -integer $sizes] {lindex $filenames $idx}]
}
set filenames [glob -type f *.foo]; # Or whatever
puts [join [SortFilesBySize $filenames] "n"]

单向:

#!/usr/bin/env tclsh
proc zip {list1 list2} {
lmap a $list1 b $list2 { list $a $b }
}
proc heads {pairs} {
lmap pair $pairs { lindex $pair 0 }
}
proc sort_by_size {names sizes} {
heads [lsort -integer -increasing -index 1 [zip $names $sizes]]
}
set names {a.txt b.txt c.txt}
set sizes {3 2 1}
puts [sort_by_size $names $sizes]

将名称和大小组合成文件名和大小对的列表,根据大小进行排序,然后只返回重新排序的文件名。本质上是perl经典的Schwartzian变换习惯用法的tcl版本。

最新更新