#!/usr/local/perl -w use strict; use File::Find::Rule; use constant FMT => " %5s %-10s %-60s\n"; my @userdir = do { opendir my $dh, "/home"; grep +($_ ne '.' and $_ ne '..' and -d "/home/$_"), readdir $dh; }; my %uid = map { (getpwnam $_)[0,2] } @userdir; my $i = 0; my @offending = map { File::Find::Rule ->exec(sub { $i++ % 80 or print STDERR '.'; 1 }) ->not_uid($uid{$_}) ->in("/home/$_"); } keys %uid; print STDERR "\n"; printf FMT, 'UID', 'User', 'Offending file'; print "-" x 80 . "\n"; my %uname = reverse %uid; for (@offending) { my $fuid = +(stat)[4]; warn "Can't stat $_\n", next if not defined $fuid; $uname{$fuid} = getpwuid($fuid) unless exists $uname{$fuid}; printf FMT, $fuid, $uname{$fuid}, $_; }