use strict; use File::Find; use Fcntl ':mode'; my $cur_dir; my %stats; my ($files, $dirs, $links, $tfiles, $tdirs, $tlinks); my ($mode, $user, $group); my $depth = split('/', $ARGV[0]) + $ARGV[1]; find ( \&user_files, $ARGV[0]); print "Files: $tfiles\n"; print "Dirs: $tdirs\n"; print "Links: $tlinks\n"; printf "%-40s %-10s %-10s %-10s\n", 'Directory', 'Dirs', 'Files', 'Links'; print '-' x 70, "\n"; for ( sort keys %stats ) { $stats{$_}{dirs}-- if ( $_ eq $ARGV[0] ); my $tdirs = int($stats{$_}{tdirs}); my $tfiles = int($stats{$_}{tfiles}); my $tlinks = int($stats{$_}{tlinks}); my $dirs = int($stats{$_}{dirs}); my $files = int($stats{$_}{files}); my $links = int($stats{$_}{links}); printf "%-40s %-10s %-10s %-10s\n", $_, "$tdirs/$dirs", "$tfiles/$files", "$tlinks/$lin ks"; } exit(0); #------------------------------ Sub-routines ---------------------------------- sub user_files { if ( $File::Find::name =~ /\/\.snapshot/ ) { $File::Find::prune = 1; return; } ($mode, $user, $group) = (stat($File::Find::name))[2,4,5]; $cur_dir = ''; my $count = 0; for my $d ( split('/', $File::Find::dir) ) { $count++; next if ( $d eq '' ); $cur_dir .= "/$d"; last if ( $count == $depth ); } if ( -f $File::Find::name ) { $tfiles++; $stats{$cur_dir}{tfiles}++; $stats{$cur_dir}{files}++ if ( $mode & S_IXOTH ); } elsif ( -d $File::Find::name ) { $tdirs++; $stats{$cur_dir}{tdirs}++; $stats{$cur_dir}{dirs}++ if ( $mode & S_IXOTH ); } elsif ( -l $File::Find::name ) { $tlinks++; $stats{$cur_dir}{tlinks}++; $stats{$cur_dir}{links}++ if ( $mode & S_IXOTH ); } }