开发者

Perl Get Parent Folder Name

What is the solution to get the name of the parent directory using File::Find. I know how to get only the filename or only the directory path but I don't know how to do this for the last containing directory.

For example, if the directory is /dir_1/dir_2/dir_3/.../dir_n/*.txt I need to get the '开发者_开发问答dir_n' name.

use strict;
use warnings;
use File::Find;

my $dir = "some_path";

find(\&file_handle, $dir); 
sub file_handle {
    /\.txt$/ or return;
    my $fd = $File::Find::dir;
    my $fn = $File::Find::name;
    # ...
}


Given the directory path, you then apply File::Basename (another core module) to the path to obtain the last portion of the directory.

use strict;
use warnings;
use File::Find;
use File::Basename;

my $dir = "some_path";

find(\&file_handle, $dir); 
sub file_handle {
    /\.txt$/ or return;
    my $fd = $File::Find::dir;
    my $fn = $File::Find::name;
    my $dir = basename($fd);
    # ....
}


#!/usr/local/bin/perl -w

use strict;
use File::Basename;
use Cwd 'abs_path';

my $f = "../some/path/to/this_directory/and_filename";  
my $d = basename(dirname(abs_path($f)));
say $d;

returns "this_directory"


You can just split and grab the second-to-last element in the array:

my $fname = "/folder/sub-folder/filename.bin";
my @parts = split('/', $fname);
if( @parts > 1 ) {
   return $parts[@parts - 2];
} else {
   return '/';
}


If you are willing to install non-core modules, the Path::Class can come handy:

use Path::Class;

dir("some_dir")->recurse(callback => sub {
    my $file = shift;
    return if $file->is_dir;
    return if $file =~ /\.txt$/i;

    my $fn  = $file->basename;
    my $fd  = $file->parent;
    my $dir = $file->parent->parent;
});

It gives you handy objects instead of strings and imo nice operations on them.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜