Jump to content

File size distribution: Difference between revisions

m
Line 405:
import System.Environment (getArgs)
import System.FilePath.Posix ((</>))
import System.IO (hFileSize, withFile, IOMode(ReadMode), FilePath)
import Text.Printf (printf , hPutStrLn, stderr)
import Text.Printf (printf, hPrintf)
 
data Item = File FilePath Integer
Line 425 ⟶ 426:
groupMinMax = (,0) <$> zip groups (pred <$> tail groups)
 
placeGroups [] gs = gsid
placeGroups (d:ds) gs = placeGroups ds $.
fmap (\g@((min,max), count) ->
if d >= min && d <= max
then ((min, max), succ count)
else g
) gs
 
fileSizes :: [Item] -> [Integer]
Line 459 ⟶ 460:
 
groupsFromGroup :: Int -> [Integer] -> FrequencyGroup -> [FrequencyGroup]
groupsFromGroup gsize fileSizes ((min, max), count)
| length range > 1 = frequencyGroups gsize range
| otherwise = [((min, max), count)]
Line 477 ⟶ 478:
 
expand = ((\g@((min, max), count) ->
if count > groupThreshold then
groupsFromGroup gsize fileSizes g
else
[g]
) =<<)
 
displaySize :: Integer -> String
Line 501 ⟶ 502:
collectItems folderPath = catch tryCollect
(\e -> do
lethPrintf errstderr ="Skipping: %s\n" $ show (e :: IOException)
printf "Skipping: %s\n" err
pure []
)
Line 515:
displayFrequency :: Integer -> FrequencyGroup -> IO ()
displayFrequency filesCount ((min, max), count) =
printf "%5s <-> %5s = %5d-10d %6.3f%%: %-5s\n"
(displaySize min)
(displaySize max)
Line 558:
args <- getArgs
case parseArgs args of
Left errorMessage -> putStrLnhPutStrLn stderr errorMessage
Right (path, groupSize) -> do
items <- parallelItemCollector path
Line 566:
printf "Total folders: %d\n" folderCount
printf "Total size: %s\n" $ displaySize $ totalBytes items
putStrLn "\nDistribution:\n"
let results = expandedGroups groupSize (sizes items) (groupThreshold fileCount) items
printf "%5s <-> %4s %8s\n" "From" "To" "Count"
putStrLn $ replicate 37 '-'
mapM_ (displayFrequency fileCount) results
where
Line 577 ⟶ 579:
. initialGroups gsize</lang>
{{out}}
<pre style="height: 50rem;">$ filedist ~/Music
Using 4 worker threads
Total files: 688
Line 584 ⟶ 586:
 
Distribution:
 
0B <-> 80B = 7 1.017%: █
From <-> To Count
81B <-> 161B = 74 10.756%: ███████████
-------------------------------------
162B <-> 242B = 112 16.279%: ████████████████
243B 0B <-> 323B 80B = 7 99 14 1.390017%: ██████████████
322B 81B <-> 643B161B = 74 23 3 10.343756%: ███ ███████████
644B162B <-> 965B242B = 112 2 0 16.291279%: ████████████████
966B243B <-> 1KB323B = 99 1 0 14.145390%: ██████████████
3KB 322B <-> 6KB643B = 23 12 1 3.744343%: ██ ███
6KB 644B <-> 10KB965B = 2 22 3 0.198291%: ███
10KB966B <-> 13KB 1KB = 1 12 1 0.744145%: ██
14KB 3KB <-> 27KB 6KB = 12 15 21.180744%: ██
27KB 6KB <-> 41KB10KB = 22 6 0 3.872198%: ███
41KB10KB <-> 54KB13KB = 12 22 3 1.198744%: █████
54KB14KB <-> 108KB 27KB = 15 99 14 2.390180%: ████████████████
108KB 27KB <-> 163KB 41KB = 6 23 3 0.343872%: ███
163KB 41KB <-> 217KB 54KB = 22 8 1 3.163198%: ███
236KB 54KB <-> 473KB108KB = 99 3 0 14.436390%: ██████████████
709KB108KB <-> 946KB163KB = 23 44 6 3.395343%: █████████
3MB163KB <-> 217KB = 8 5MB = 4 01.581163%: █
5MB236KB <-> 473KB = 7MB3 = 21 3 0.052436%: ███
7MB709KB <-> 13MB946KB = 44 72 106.465395%: ████████████████
13MB 3MB <-> 20MB 5MB = 4 6 0.872581%: █
20MB 5MB <-> 27MB 7MB = 21 1 0 3.145052%: ███
7MB <-> 13MB = 72 10.465%: ██████████
0B 13MB <-> 80B20MB = 6 7 10.017872%: █
801B20MB <-> 889B27MB = 1 2 0.291145%:
 
$ filedist ~/Music 10
Line 615 ⟶ 620:
 
Distribution:
 
0B <-> 88B = 7 1.017%: █
From <-> To Count
89B <-> 177B = 75 10.901%: ███████████
-------------------------------------
178B <-> 266B = 156 22.674%: ███████████████████████
267B 0B <-> 355B 88B = 7 57 8 1.285017%: ████████
356B 89B <-> 444B177B = 75 20 2 10.907901%: ███ ███████████
178B <-> 266B = 156 156 22.674%: ███████████████████████
801B <-> 889B = 2 0.291%:
959B267B <-> 2KB355B = 57 1 0.145%: 8.285%: ████████
4KB 356B <-> 5KB444B = 20 1 0 2.145907%: ███
5KB 801B <-> 6KB889B = 2 1 0.145291%:
6KB 959B <-> 7KB2KB = 1 11 1 0.599145%: ██
7KB4KB <-> 7KB5KB = 1 10 1 0.453145%:
7KB5KB <-> 8KB6KB = 1 4 0.581145%:
8KB6KB <-> 9KB7KB = 11 7 1.017599%: ██
9KB7KB <-> 19KB 7KB = 10 21 3 1.052453%: ███
19KB 7KB <-> 28KB 8KB = 4 6 0.872581%: █
28KB 8KB <-> 38KB 9KB = 7 4 01.581017%: █
38KB 9KB <-> 47KB19KB = 21 12 1 3.744052%: ██ ███
47KB19KB <-> 57KB28KB = 6 16 2 0.326872%: ██
57KB28KB <-> 66KB38KB = 4 23 3 0.343581%: ███
66KB38KB <-> 75KB47KB = 12 26 3 1.779744%: ██████
75KB47KB <-> 85KB57KB = 16 15 2.180326%: ██
85KB57KB <-> 94KB66KB = 23 17 2 3.471343%: ██ ███
95KB66KB <-> 189KB 75KB = 26 42 6 3.105779%: ██████████
189KB 75KB <-> 284KB 85KB = 15 4 0 2.581180%: ██
284KB 85KB <-> 378KB 94KB = 17 2 0 2.291471%: ██
851KB 95KB <-> 946KB189KB = 42 44 6.395105%: ██████
3MB189KB <-> 284KB = 4 5MB = 5 0.727581%: █
5MB284KB <-> 378KB = 8MB2 = 41 5 0.959291%: ██████
8MB851KB <-> 11MB946KB = 44 35 56.087395%: ███████████
11MB 3MB <-> 13MB 5MB = 5 16 2 0.326727%: ██
13MB 5MB <-> 16MB 8MB = 41 3 0.436%: 5.959%: ██████
16MB 8MB <-> 19MB11MB = 35 3 0.436%: 5.087%: █████
24MB11MB <-> 27MB13MB = 16 1 0 2.145326%: ██
0B 13MB <-> 88B16MB = 3 7 1 0.017436%:
16MB <-> 19MB = 3 0.436%:
24MB <-> 27MB = 1 0.145%:
</pre>
 
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.