75 lines
1.2 KiB
Tcl
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
|