2010-11-30 10 views
9

Was ist die Lösung, um den Namen des übergeordneten Verzeichnisses mit File :: Find zu erhalten. Ich weiß, wie man nur den Dateinamen oder nur den Verzeichnispfad bekommt, aber ich weiß nicht, wie man das für das letzte enthaltende Verzeichnis tut. Wenn das Verzeichnis beispielsweise /dir_1/dir_2/dir_3/.../dir_n/*.txt ist, muss ich den Namen "dir_n" erhalten.Perl Übergeordneter Ordner 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; 
    # ... 
} 
+1

Diese werden als * Verzeichnisse * nicht * Ordner * -, die mir immer klingt wie Baby-Talk. :( – tchrist

+0

Tnanks für den Rat. Ich habe den Beitrag korrigiert. – thebourneid

Antwort

15

der Verzeichnispfad gegeben, Sie dann File::Basename (ein weiteres Kernmodul) auf den Pfad gelten den letzten Teil des Verzeichnisses zu erhalten.

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

können Sie einfach geteilt und greifen das zweite bis letztes Element im Array:

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

Wenn Sie bereit sind, Nicht-Kern-Module zu installieren, die Path::Class kann kommen praktisch:

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

Es gibt Ihnen praktische Objekte statt Strings und imo nette Operationen auf ihnen.

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; 

returns "this_directory"

Verwandte Themen