我将如何根据这些文件的大小使用 Tcl 对文件进行排序?
How would I sort file using Tcl according to size of those files?
我有一个文件列表和一个单独的文件大小列表,使用“文件大小 ”。
我需要根据文件的大小按升序排列,然后进一步处理。
有人可以提供我可以遵循的分步过程吗?
这是我目前所做的
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
所以,这给了我一个字典,其中键 -> 文件和值 -> 文件大小。我只需要根据文件大小的值对这本字典进行排序。
一种方式:
#!/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]
将名称和大小组合成文件名和大小对列表,根据大小排序,然后 returns 只是重新排序的文件名。本质上是 perl
经典 Schwartzian Transform 习语的 tcl
版本。
您需要做的第一件事是获取文件名列表及其大小。您可以单独保留尺寸。
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"]
我有一个文件列表和一个单独的文件大小列表,使用“文件大小
我需要根据文件的大小按升序排列,然后进一步处理。
有人可以提供我可以遵循的分步过程吗?
这是我目前所做的
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
所以,这给了我一个字典,其中键 -> 文件和值 -> 文件大小。我只需要根据文件大小的值对这本字典进行排序。
一种方式:
#!/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]
将名称和大小组合成文件名和大小对列表,根据大小排序,然后 returns 只是重新排序的文件名。本质上是 perl
经典 Schwartzian Transform 习语的 tcl
版本。
您需要做的第一件事是获取文件名列表及其大小。您可以单独保留尺寸。
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"]