use File::Find; find(\&wanted, 'dir1
', 'dir2
'...); sub wanted { ... } use File::Find; finddepth(\&wanted, 'dir1
', 'dir2
'...); # traverse depth-first sub wanted { ... }
find()
is similar to the UNIX
find(1) command in that it traverses the specified
directories, performing whatever tests or other actions you request. However,
these actions are given in the subroutine, wanted()
, which
you must define (but see find2perl below). For example, to
print out the names of all executable files, you could define
wanted()
this way:
sub wanted { print "$File::Find::name\n" if -x; }
$File::Find::dir
contains the current directory name, and
$_ the current filename within that directory.
$File::Find::name
contains
"$File::Find::dir/$_"
. You are chdired to $File::Find::dir
when
find()
is called. You can set
$File::Find::prune
to true in wanted()
in
order to prune the tree; that is, find()
will not descend
into any directory when $File::Find::prune
is set.
This library is primarily for use with the find2perl(1) command,
which is supplied with the standard Perl distribution and converts a
find(1) invocation to an appropriate wanted()
subroutine.
The command:
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 the AFS.
finddepth()
is just like find()
, except that it does a
depth-first search.
Here's another interesting wanted()
function. It will find all
symbolic links that don't resolve:
sub wanted { -l and not -e and print "bogus link: $File::Find::name\n"; }