2010-11-30 18 views
9

¿Cuál es la solución para obtener el nombre del directorio padre utilizando File :: Find. Sé cómo obtener solo el nombre del archivo o solo la ruta del directorio, pero no sé cómo hacer esto para el último directorio que contiene.Perl Obtener el nombre de la carpeta principal

Por ejemplo, si el directorio es /dir_1/dir_2/dir_3/.../dir_n/*.txt, necesito obtener el nombre '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

Estos son llamados directorios * *, * no * - carpetas que siempre suena como habla infantil para mí. :( – tchrist

+0

Tnanks por el consejo. Corregí la publicación. – thebourneid

Respuesta

15

Dada la ruta del directorio, a continuación, aplica File::Basename (otro módulo principal) a la ruta para obtener la última parte del directorio.

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

Sólo puede dividir y agarrar el segundo al último elemento de la matriz:

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

Si usted está dispuesto a instalar los módulos no esenciales, el Path::Class puede venir a mano:

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

Le ofrece objetos útiles en lugar de cadenas y operaciones imo nice en ellos.

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; 

devuelve "this_directory"

Cuestiones relacionadas