Perl获取父文件夹名称

时间:2010-11-30 21:18:39

标签: perl

使用File :: Find获取父目录名称的解决方案是什么?我知道如何只获取文件名或只获取目录路径,但我不知道如何为最后一个包含目录执行此操作。

例如,如果目录为/dir_1/dir_2/dir_3/.../dir_n/*.txt,我需要获取“dir_n”名称。

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;
    # ...
}

4 个答案:

答案 0 :(得分:15)

根据目录路径,然后将File::Basename(另一个核心模块)应用于路径以获取目录的最后一部分。

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);
    # ....
}

答案 1 :(得分:8)

#!/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;

返回“this_directory”

答案 2 :(得分:2)

你可以拆分并抓住数组中倒数第二个元素:

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

答案 3 :(得分:1)

如果您愿意安装非核心模块,Path::Class可以派上用场:

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;
});

它为您提供了方便的对象而不是字符串,并且对它们进行了很好的操作。