Dir() - Recursive File Listing in Perl
Dir function can be used to list all the files in a given folder recursively.
I often had the need to list all files in a given folder. When I say 'all files', I don't mean just the files in that folder - but all the files in all folder under it. I wrote a small recursive function to do this. I had this requirement so many times that I have translated the code to almost all languages I know - I have this function in Perl, PHP, Ruby and Tcl.
Here is the perl part of the code...
# Function : dir
# Arguments : The path of the directory whose directory list you want
# Returns : A flat list with the path of all the files in the directory given as the argument.
# This function will take a folder as the argument and go thru every it recursively and return the list of
# all files and folders in that folder.
sub dir {
my $current_folder = shift;
my @all;
chdir($current_folder) or die("Cannot access folder $current_folder");
#Get the all files and folders in the given directory.
my @both = glob("*");
my @folders;
foreach my $item (@both) {
if(-d $item) { #Get all folders into another array - so that first the files will appear and then the folders.
push(@folders,$item);
} else { #If it is a file just put it into the final array.
push(@all,$item);
}
}
foreach my $this_folder (@folders) {
#Add the directory name to the return list - comment the next line if you don't want this feature.
push(@all,"$this_folder/");
#Continue calling this function for all the folders
my $full_path = "$current_folder/$this_folder";
my @deep_items = dir($full_path); # :RECURSION:
foreach my $item (@deep_items) {
push(@all,"$this_folder/$item");
}
}
return @all;
}
my @all = dir("/home/binnyva/Scripts/Perl/");
foreach my $item (@all) {
print "--- $item ---\n";
}
This functionality is also available using the File::Find module available with any standard distribution. If you want to access more advanced features, use File::Find::Rule available from CPAN. The advantage of using my code is that you can modify the code to fit your purposes.