RosettaCodeData/Task/File-size-distribution/Tcl/file-size-distribution-1.tcl
2025-06-11 20:16:52 -04:00

75 lines
1.2 KiB
Tcl

#!/usr/bin/env tclsh
# table/count of size categories
# (numbers are both strings and numbers)
# ''sizes(100)'' is the array member ''sizes("100")''
array set sizes {
0 0
100 0
1000 0
10000 0
100000 0
1000000 0
10000000 0
100000000 0
1000000000 0
}
# sorted list of keys
set keys [lsort -integer [array names sizes]]
# check size and update count
proc count {f} {
variable sizes
variable keys
#size in bytes of file
set size [file size $f]
# increment count
foreach { v } $keys {
if {$size <= $v} {incr sizes($v) ; break}
}
}
#recursive file name glob
proc getfiles {f} {
if { [file isfile $f] } {
# function call
count $f
} elseif { [file isdirectory $f] } {
set files [glob -nocomplain [file join $f *]]
# recursive call
foreach d $files { getfiles $d }
} else {
return
}
}
# main
if { [info script] eq $::argv0 } {
if { $::argc eq 0 } {
puts stderr "need a dir to start searching"
return 1
}
foreach dir $::argv {
getfiles $dir
foreach v $keys {
puts "$v : \t$sizes($v)"
}
}
return 0
}
# end