in reply to Re: Find the n biggest files
in thread Find the n biggest files
use strict; use warnings; use File::Find::Rule; my ($n, @dirs) = @ARGV; $n ||= 20; @dirs = '.' unless @dirs; sub top { my $file_sizes = shift; my @big = (sort { $file_sizes->{$b} <=> $file_sizes->{$a} } keys % +$file_sizes)[0..$n-1]; my %big = map { $_ => $file_sizes->{$_} } @big; return \%big } my $rule = File::Find::Rule->file->readable; my $file_sizes = {}; $rule->start(@dirs); while (defined (my $image = $rule->match) ) { my $size = (stat $image)[7]; $file_sizes->{$image} = $size if defined $size; $file_sizes = top($file_sizes) if keys %$file_sizes > ($n + 10000) +; } $file_sizes = top($file_sizes); print "Biggest $n\n"; for my $file ( sort { $file_sizes->{$b} <=> $file_sizes->{$a} } keys % +$file_sizes ){ printf " %8dK %s\n", $file_sizes->{$file} / 1024, $file; }
|
|---|