2010-11-30 34 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

+0

アドバイスのためのTanks。私は投稿を修正しました。 – thebourneid

答えて

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

あなただけ分割し、配列内の最後から2番目の要素をつかむことができます:あなたは非コアモジュールをインストールするために喜んでいる場合

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

これは、文字列の代わりに便利なオブジェクトを提供し、それらに対して便利な操作を提供します。

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"

関連する問題