http://www.perlmonks.org?node_id=1000205


in reply to How to read files in all subfolders?

Hi coltman,
To open directory use opendir, not open which is use for files and associated with a FILEHANDLES.
The code below uses recursive call to go through all the folders in a directory given.

#!/usr/bin/perl use warnings; use strict; use Cwd qw(abs_path); die "no directory provided " unless defined $ARGV[0]; my $path = abs_path $ARGV[0]; search_all_folder($path); sub search_all_folder { my ($folder) = @_; if ( -d $folder ) { chdir $folder; opendir my $dh, $folder or die "can't open the directory: $!"; while ( defined( my $file = readdir($dh) ) ) { chomp $file; next if $file eq '.' or $file eq '..'; search_all_folder("$folder/$file"); ## recursive call read_files($file) if ( -f $file ); } closedir $dh or die "can't close directory: $!"; } } sub read_files { my ($filename) = @_; open my $fh, '<', $filename or die "can't open file: $!"; while (<$fh>) { print $_, $/; } }
Hope this helps.
UPDATE:
Like others have said before now, it will be half the work and a lot easiler to use module like File::Find like so:
use warnings; use strict; use Cwd qw(abs_path); use File::Find qw(find); die "no directory provided " unless defined $ARGV[0]; my $path = abs_path $ARGV[0]; find( \&search_all_folder, $path ); sub search_all_folder { chomp $_; return if $_ eq '.' or $_ eq '..'; read_files($_) if (-f); } sub read_files { my ($filename) = @_; open my $fh, '<', $filename or die "can't open file: $!"; while (<$fh>) { print $_, $/; } }

If you tell me, I'll forget.
If you show me, I'll remember.
if you involve me, I'll understand.
--- Author unknown to me