使用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;
# ...
}
答案 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;
});
它为您提供了方便的对象而不是字符串,并且对它们进行了很好的操作。