File::Find(3)
NNAAMMEE
find - traverse a file tree
finddepth - traverse a directory structure depth-first
SSYYNNOOPPSSIISS
use File::Find;
find(\&wanted, '/foo','/bar');
sub wanted { ... }
use File::Find;
finddepth(\&wanted, '/foo','/bar');
sub wanted { ... }
DDEESSCCRRIIPPTTIIOONN
The wanted() function does whatever verifications you
want. $File::Find::dir contains the current directory
name, and $_ the current filename within that directory.
$File::Find::name contains "$File::Find::dir/$_". You are
chdir()'d to $File::Find::dir when the function is called.
The function may set $File::Find::prune to prune the tree.
File::Find assumes that you don't alter the $_ variable.
If you do then make sure you return it to its original
value before exiting your function.
This library is primarily for the find2perl tool, which
when fed,
find2perl / -name .nfs\* -mtime +7 \
-exec rm -f {} \; -o -fstype nfs -prune
produces something like:
sub wanted {
/^\.nfs.*$/ &&
(($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
int(-M _) > 7 &&
unlink($_)
||
($nlink || (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_))) &&
$dev < 0 &&
($File::Find::prune = 1);
}
Set the variable $File::Find::dont_use_nlink if you're
using AFS, since AFS cheats.
finddepth is just like find, except that it does a depth-
first search.
Here's another interesting wanted function. It will find
all symlinks that don't resolve:
sub wanted {
-l && !-e && print "bogus link: $File::Find::name\n";
}
BBUUGGSS
There is no way to make find or finddepth follow symlinks.