#!/usr/bin/perl my $root_dir = '/var/home/gryphon'; my $file_icon = '- '; my $dir_icon = '# '; my $vol_icon = '* '; my $indent_icon = ' '; my $output_file = 'list-of-stuff.txt'; use strict; use File::Find; use File::stat; my (%files, %dirs); find(\&learn_files, $root_dir); open(OUT, "> $output_file"); foreach (sort keys %dirs) { my @indent = split(/\//, substr($_, length($root_dir) + 1)); print OUT $indent_icon x ($#indent + 1); if ($#indent > -1) { print OUT $dir_icon, $indent[$#indent]; } else { print OUT $vol_icon, $_; } print OUT ' (', fix_bytes($dirs{$_}{size} + 0); print OUT ', ', comma($dirs{$_}{files} + 0), ' files'; print OUT ', ', comma($dirs{$_}{subdirs} + 0), ' folders)', "\n"; foreach my $file (sort keys %{$files{$_}}) { print OUT $indent_icon x ($#indent + 2); print OUT $file_icon, $file, ' (', fix_bytes($files{$_}{$file}), ")\n"; } } close(OUT); sub learn_files { if (-d) { if ($_ ne '.') { $dirs{$File::Find::dir}{subdirs}++; add_up($File::Find::dir); } } else { $dirs{$File::Find::dir}{files}++; my $file_info = stat($File::Find::name); $dirs{$File::Find::dir}{size} += $file_info->size; $files{$File::Find::dir}{$_} = $file_info->size; add_up($File::Find::dir, $file_info->size) if ($File::Find::dir ne $root_dir); } } sub add_up { my $dir = substr($_[0], length($root_dir) + 1); my $curr_dir = $root_dir; foreach (split(/\//, $dir)) { if ($_[1] eq '') { $dirs{$curr_dir}{subdirs}++; } else { $dirs{$curr_dir}{files}++; $dirs{$curr_dir}{size} += $_[1]; } $curr_dir .= "/$_"; } } sub fix_bytes { return comma(int($_[0] / 10737418.24) / 100) . ' GB' if ($_[0] > 1073741824); return comma(int($_[0] / 10485.76) / 100) . ' MB' if ($_[0] > 1048576); return comma(int($_[0] / 10.24) / 100) . ' KB' if ($_[0] > 1024); return comma($_[0]) . ' bytes'; } sub comma { my $text = reverse $_[0]; $text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g; return scalar reverse $text; }