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"; }
There is no way to make find or finddepth follow symlinks.
If rather than formatting bugs, you encounter substantive content errors in these documents, such as mistakes in the explanations or code, please use the perlbug utility included with the Perl distribution.