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, a code reference, or a string that contains a subroutine name. 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.
wanted
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().
bydepth
{ bydepth =
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::dir/$_"
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
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.
finddepth
find
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.
To install lib, copy and paste the appropriate command in to your terminal.
cpanm
cpanm lib
CPAN shell
perl -MCPAN -e shell install lib
For more information on module installation, please visit the detailed CPAN module installation guide.