Easy file finding with File::Find::Rule
by bigpresh on Jan.30, 2009, under Perl, Programming, reviews
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.