Recently I found File::Find::Rule on the CPAN, and I’m impressed how easy it makes it to get a list of files to work on.
A fairly common way to do this in Perl would be something like:
my $dirh = new DirHandle($somedir);
while (my $entry = $dirh->read) {
# Skip hidden files and directories:
next if ($entry =~ /^\./ || !-f $entry);
# Skip if it doesn't match the name we want:
next if ($entry !~ /\.txt$/);
print "Found: $somedir/$entry\n";
}
File::Find::Rule makes things rather easier:
my @files = File::Find::Rule->file()->name('*.txt')->in($somedir);
Various conditions can be chained together to find exactly what you want.
Another example, showing combining rules with ->any() to find files matching any of those conditions:
# find avis, movs, things over 200M and empty files
my @files = File::Find::Rule->any(
File::Find::Rule->name( '*.avi', '*.mov' ),
File::Find::Rule->size( '>200M' ),
File::Find::Rule->file->empty,
)->in('/home');
There’s plenty of other ways to do this, but I think File::Find::Rule gives a way to clearly and concisely state what you want and get the job done.