# Last update: 2008/01/14 # # List all files of all subdirs sorted by filesize # # (p) J. Nagasaki # # INPUT: actual sub directory file size amount # ARGUMENTS: [-n] output only n largest files (optional) # OUTPUT: Size, path, and filename list sorted by largest file on top # # get argument, if existing $maxfiles = $ARGV[0]; $maxfiles =~ s/-([0-9]+)/$1/; # global directory list @filepath; # global file list @filelist; # root directory or current (as here) $rootdir = "."; # call to recursive self calling sub routine getdir($rootdir); unshift(@filepath, $rootdir); # add root directory # show results foreach (@filepath) { $thispath = $_; opendir(DIR, "$_"); my @files = readdir(DIR); closedir(DIR); foreach (@files) { # exclude ".", ".." and directories if (($_ ne "\.") && ($_ ne "\.\.") && !(-d "$thispath\\$_")) { $size = -s "$thispath\\$_"; # push CSV format: ; push(@filelist, "$thispath\\$_;$size\n"); } } } @filelist = sort(Filesize @filelist); $i = 0; foreach (@filelist) { @fileinfo = split(/;/, $_); chomp($fileinfo[1]); $sizeformated = formatsize($fileinfo[1]); print ("$sizeformated - $fileinfo[0]\n"); $i++; last if (($maxfiles ne "") && ($i >= $maxfiles)); } #-------------------------- # get directory (recursive called subroutine) # all variables have to be declared with "my" to give them their # own area of validity in the actual recursion level sub getdir { my $dir = shift; opendir(DIR, "$dir"); my @files = readdir(DIR); closedir(DIR); foreach (@files) { my $newdir = "$dir\\$_"; # create absolute path # check if directory and not "." or ".." if ((-d $newdir) && ($_ ne "\.") && ($_ ne "\.\.")) { push (@filepath, $newdir); # add new directory getdir($newdir); # recursive call } } } sub Filesize { @aa = split(/;/, $a); @bb = split(/;/, $b); if($aa[1] > $bb[1]) { return -1; } elsif($aa[1] == $bb[1]) { return 0; } else { return 1; } } sub formatsize { $size = shift; if ($size < 1024) { $outsize = sprintf("%9.2f", $size)." Bytes"; } elsif ($size < 1048576) { $outsize = $size / 1024; # 1K $outsize = sprintf("%8.2f", $outsize)."K Bytes"; } elsif ($size < 1073741824) { $outsize = $size / 1048576; # 1M $outsize = sprintf("%8.2f", $outsize)."M Bytes"; } else { $outsize = $size / 1099511627776; # 1G $outsize = sprintf("%8.2f", $outsize)."G Bytes"; } return $outsize; }