NAME
Path::Find - Easily find files in a directory tree
SYNOPSIS
use Path::Find;
# Recursively find all PNG files
my @list = path_find( $dir, "*.png" );
# Find all the jpegs, ignoring case
@list = path_find( $dir, qr/\.jpe?g$/i );
# Find all .cnf files in .directories
@list = path_find( $dir, qr(/^\./), qr/\.cnf$/ );
DESCRIPTION
Path::Find is the simplest way to recursively list all the files in a directory and its subdirectories.
FUNCTIONS
path_find
@list = find_path( $dir );
@list = find_path( $dir, $fileglob );
@list = find_path( $dir, $dirglob, $fileglob );
Recurses $dir and all subdirectories that match $dirglob
, returning a list of all files that match $filegob
.
- $dir
-
Top directory to search.
- $fileglob
-
Glob or other thing to select which files are returned. Passed to "matchable". Defaults to
*
. - $dirglob
-
Glob or other thing to select which subdirectories are recursed. Passed to "matchable". Defaults to
*
.
Returns the list of files, with $dir
prepended.
The globs ($fileglob
and $dirglob
maybe a string containing a BSD-style glob:
@list = path_find( "/some-dir", "*.png" );
They may be a regex:
@list = path_find( "/other-dir", qr(\.png$) );
They may be a coderef:
@list = path_find( $TOP, sub { $DIRS{$_[0]} }, sub { 1 } );
They may be an object:
my $dirmatch = My::DirMatch->new;
my $filematch = My::FileMatch->new;
@list = path_find( $TOP, $dirmatch, $filematch );
matchable
Convert a glob or other thing into a coderef useful for matching a file or directory. my $sub = matchable( $glob );
Convert a glob into a coderef useful for matching a file or directory. $glob
may be one of the following:
Glob string
my $sub = matchable( "*.txt" );
Uses Text::Glob to convert the string into a regex, then builds a subroutine from that. Not that a leading *
does not match a leading .
, eg *.txt
will not match .foo.txt
.
Regexp
my $sub = matchable( qr(^honk.+txt$) );
Builds a subroutine that matches the directory entry to the given regex. Note that you must anchor the regex if this is important.
CODE
my $sub = matchable( sub {
my( $entry, $directory, $fullname, $depth ) = @_;
return 1 if length( $entry ) > 3;
return;
} );
Returns the coderef as-is. "find_path" will invoke the subref with the following parameters:
- $entry
-
Current directory entry being matched. If the file or directory is called
/some/dir/entry
then$entry
will be just"entry"
. - $directory
-
Full path of the directory that the current entry being matched. If the file or directory is called
/some/dir/entry
then$directory
/some/dir
. - $fullname
-
Full path of the directory entry being matched. If the file or directory is called
/some/dir/entry
then$fullname
is the just that,/some/dir/entry
. - $depth
-
Number of subdirectories between the current
$directory
and the top directory passed tofind_path
. Invocations in the top directory have$depth=0
.
Object
my $object = MyClass->new;
my $sub = matchable( $object );
package MyClass;
sub new { return bless {}, shift }
sub match
{
my( $self, $entry, $directory, $fullname ) = @_;
return 1 if $entry eq 'yes';
return;
}
Builds a subroutine that calls object method match
for each directory entry. The parameters are the same as CODE
invocations, but with the object being first parameter, as is customary.
SEE ALSO
AUTHOR
Philip Gwyn, <gwyn -AT- cpan.org>
COPYRIGHT AND LICENSE
Copyright (C) 2023 by Philip Gwyn. All rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.26.3 or, at your option, any later version of Perl 5 you may have available.