我有一个文件列表和一个单独的文件大小列表,使用"文件大小<文件名>";。
我被要求根据大小按升序对文件进行排序,然后进一步进行处理。
有人能提供一个我可以遵循的循序渐进的过程吗?
这就是我到目前为止所做的
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
版本。