2010-11-30 4 views
9

Каково решение получить имя родительского каталога с помощью File :: Find. Я знаю, как получить только имя файла или только путь к каталогу, но я не знаю, как это сделать для последнего содержащего каталога.Perl Получить родительскую папку Имя

Например, если каталог /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; 
    # ... 
} 
+1

Они называются * каталоги *, а не * папки * - который всегда звучит как детский лепет мне. :( – tchrist 2010-11-30 21:29:18

ответ

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

Вы можете просто разделить и захватить второй до последнего элемента в массиве:

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

Это дает вам удобные объекты вместо строк и imo славные операции над ними.

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

Смежные вопросы