Processing All Files in a Directory Recursively
Problem
You want to do something to each file and subdirectory in a particular directory.
Solution
Use the standard File::Find module.
use File::Find; sub process_file { # do whatever; } find(\&process_file, @DIRLIST);
Discussion
File::Find provides a convenient way to process a directory
recursively. It does the directory scans and recursion for you. All
you do is pass find
a code reference and a list of
directories. For each file in those directories, recursively,
find
calls your function.
Before calling your function, find
changes to the
directory being visited, whose path relative to the starting
directory is stored in the $File::Find::dir
variable. $_
is set to the basename of the file
being visited, and the full path of that file can be found in
$File::Find::name
. Your code can set
$File::Find::prune
to true to tell
find
not to descend into the directory just seen.
This simple example demonstrates File::Find. We give
find
an anonymous subroutine that prints the name
of each file visited and adds a /
to the names of
directories:
@ARGV = qw(.) unless @ARGV; use File::Find; find sub { print $File::Find::name, -d && '/', "\n" }, @ARGV;
This prints a /
after directory names using the
-d file test operator, which returns
the empty string '' if it fails.
The following program prints the sum of everything in a directory. It
gives find
an anonymous subroutine to keep a running sum of the sizes of each file it visits. That includes all inode ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.