File::Find
See the current Perl documentation for File::Find.
Here is our local, out-dated (pre-5.6) version:

find - traverse a file tree
finddepth - traverse a directory structure depth-first

use File::Find; find(\&wanted, '/foo','/bar'); sub wanted { ... }
use File::Find; finddepth(\&wanted, '/foo','/bar'); sub wanted { ... }
The first argument to
find()
is either a hash
reference describing the operations to be performed for each file, or a
code reference. If it is a hash reference, then the value for the key wanted
should be a code reference. This code reference is called the wanted()
function below.
Currently the only other supported key for the above hash is
bydepth
, in presense of which the walk over directories is performed depth-first. Entry point
finddepth()
is a shortcut for specifying
{ bydepth =
1}> in the first argument of
find().
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 useful 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"; }
BUGS
There is no way to make find or finddepth follow symlinks.