Reputation: 103
I'd like to know to search sub-folders if I'm already in the subdirectory.
ex: ..build/clean/test/subfolder <-----
i've already scripted on how to get to test but can't figure out how to go into the subfolder.
The script looks something like this: Directory Handle in Perl Not Working Properly
sub response {
foreach my $arg (@ARGV) {
print "Investigating $arg directory below:-\n";
opendir(my $DIR, $arg) or die "You've Passed Invalid Directory as Arguments\n";
my $size = 0;
while(my $fileName = readdir $DIR) {
next if $fileName =~ /^\./;
my $path = File::Spec->catfile( $arg, $fileName );
if( -d $path) {
say "Folder1($arg, $fileName)"
}
$size++;
}
closedir $DIR;
if($size == 0) {
print "The $arg is an empty directory\n";
}
}
This is the sub folder
sub Folder1
{
my $prevPath = shift;
my $receivedFolder = shift;
my $realPath = "$prevPath/$receivedFolder";
my $path = File::Spec->rel2abs($realPath);
print "$path\n";
print "$receivedFolder Folder Received\n";
foreach my $folder (@folder)
{
opendir(DIR, $path) or die "You've Passed Invalid Directory as Arguments\n";
while(my $file = readdir $DIR) {
next if $file =~ /^\./;
my $path1 = File::Spec->catfile( $folder, $file );
if( -d $path1) {
say "Folder2($folder2, $file)"
}
closedir(DIR);
}
The sub 2 folder
sub Folder2 {
my $prevPath1 = shift;
my $receivedFolder1 = shift;
my $realPath1 = "$prevPath1/$receivedFolder1";
my $path1 = File::Spec->rel2abs($realPath1);
print "$path1\n";
print "$receivedFolder1 Folder Received\n";
opendir(DIR, $path1) or die "You've Passed Invalid Directory as Arguments\n";
while(my $file = readdir DIR) {
print "Current Folder has $file file\n";
}
closedir(DIR)
}
I'd like to read the files inside of sub 2 folder. However, i keep going back to the main directory using the sub 2 folder.
my @arg = ('clean');
my @folder = ('logs');
However, inside the build directory there is also a logs folder. It will be re-directed to there instead of the ../clean/test/logs
Upvotes: 2
Views: 452
Reputation: 6808
Perhaps something like following code snippet can clarify possible approach to the problem.
use strict;
use warnings;
use feature 'say';
my $dir = '.';
folder_dive($dir);
sub folder_dive {
my $folder = shift;
say "In folder: $folder";
for ( glob("$folder/*") ) {
say "directory $_" if -d; # if we got a directory
say "file $_" if -f; # if we got a file
say "\ta file" if -f;
say "\ta link" if -l;
say "\ta socket" if -S;
say "\ta pipe" if -p;
say "\ta block device" if -b;
say "\ta char device" if -c;
say "\ta text" if -T;
say "\ta binary" if -B;
say "\treadable" if -r;
say "\twritable" if -w;
say "\texecutable" if -x;
say "\towned by user" if -o;
say "\treadable by real user" if -R;
say "\twritable by real user" if -W;
say "\texecutable by real user" if -X;
say "\towned by real user" if -O;
say "\tzero size" if -z;
say "\tnonzero size" if -s;
say "\tsetuid" if -u;
say "\tsetguid" if -g;
say "\tsticky bit set" if -k;
say "\tisatty is true" if -t;
folder_dive("$_") if -d; # if we got a directory
}
}
Documentation Perl File Test Operators
Upvotes: -2
Reputation: 13664
For working with paths, I'd strongly recommend Path::Tiny.
use Path::Tiny 'path';
my $path = path "/home/tai/Documents/";
for my $child ( $path->children ) {
print "$child\n" if $child->is_file;
}
my $parent = $path->parent;
print "PARENT: $parent\n";
Upvotes: 5