2009-06-25 14 views

Respuesta

65

Si usted desea conseguir el contenido del directorio dado, y sólo él (es decir, sin subdirectorios), la mejor manera es utilizar opendir/readdir/closedir:

opendir my $dir, "/some/path" or die "Cannot open directory: $!"; 
my @files = readdir $dir; 
closedir $dir; 

También puede utilizar:

my @files = glob($dir . '/*'); 

Pero en mi opinión no es tan bueno - sobre todo porque pegote es algo bastante complejo (puede filtrar los resultados de forma automática) y utilizarlo para obtener todos los elementos del directorio parece como una tarea demasiado sencilla.

Por otro lado, si usted necesita para obtener el contenido de todos los directorios y subdirectorios, no es básicamente una solución estándar:

use File::Find; 

my @content; 
find(\&wanted, '/some/path'); 
do_something_with(@content); 

exit; 

sub wanted { 
    push @content, $File::Find::name; 
    return; 
} 
+0

Siempre olvido que readdir solo devuelve una lista de nombres de archivos relativos, ¡no la ruta completa! –

+0

Gracias por desalentar el uso de globbing para esta tarea. Otro inconveniente del uso de globbing para esto es que no encontrará archivos ocultos (aquellos que comienzan con un punto). – josch

9

esto debería hacerlo.

my $dir = "bla/bla/upload"; 
opendir DIR,$dir; 
my @dir = readdir(DIR); 
close DIR; 
foreach(@dir){ 
    if (-f $dir . "/" . $_){ 
     print $_," : file\n"; 
    }elsif(-d $dir . "/" . $_){ 
     print $_," : folder\n"; 
    }else{ 
     print $_," : other\n"; 
    } 
} 
+1

usted debe comprobar opendir para el fracaso (opendir ... o morir "Mensaje de error ps Además, ¿me estoy perdiendo algo? ¿Qué está haciendo Win32 :: GUI :: DoEvents() aquí? (No veo nada relevante en la cuestión.) – Telemachus

+0

esta es la mejor manera yo no quiero o deseo de recordar expresiones regulares para algo que debería ser fácil de hacer, voy a utilizar esto para crear una función como la lista ($ dir ,"F"); para los archivos "d" para el directorio, gracias por publicar esto – Geomorillo

11

O File::Find

use File::Find; 
finddepth(\&wanted, '/some/path/to/dir'); 
sub wanted { print }; 

Se va a ir a través de los subdirectorios si es que existen.

2

Esto listará todo (incluyendo subdirectorios) desde el directorio en el que especifique, en orden y con los atributos. He pasado días buscando algo para hacer esto, y tomé partes de toda esta discusión, y un poco de la mía, y las armé juntas. ¡¡DISFRUTAR!!

#!/usr/bin/perl -- 
print qq~Content-type: text/html\n\n~; 
print qq~<font face="arial" size="2">~; 

use File::Find; 

# find(\&wanted_tom, '/home/thomas/public_html'); # if you want just one website, uncomment this, and comment out the next line 
find(\&wanted_tom, '/home'); 
exit; 

sub wanted_tom { 
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat ($_); 
$mode = (stat($_))[2]; 
$mode = substr(sprintf("%03lo", $mode), -3); 

if (-d $File::Find::name) { 
print "<br><b>--DIR $File::Find::name --ATTR:$mode</b><br>"; 
} else { 
print "$File::Find::name --ATTR:$mode<br>"; 
} 
    return; 
} 
+3

¡Arghh, mis ojos! – javs

3

Si usted es un vago como yo que le gustaría usar el módulo File::Slurp. La voluntad función read_dir lee el contenido del directorio en una matriz, elimina los puntos, y si se necesita prefijo los archivos devueltos con el directorio de rutas absolutas

my @paths = read_dir('/path/to/dir', prefix => 1) ; 
Cuestiones relacionadas