2010-01-27 20 views
24

Duplicar posible:
How can I list all of the files in a directory with Perl?¿Cómo puedo recorrer archivos en un directorio en Perl?

quiero colocar a través de unos pocos cientos de archivos que están contenidos en el mismo directorio. ¿Cómo haría esto en Perl?

+1

¿No se ha duplicado esta pregunta de esta? http://stackoverflow.com/questions/1045792/how-can-i-list-all-of-the-files-in-a-directory-with-perl –

+1

@Leonardo Herrera De hecho, lo es. Lo siento, no recuerdo eso. Votando para cerrar. –

+0

No veo cómo es esto un duplicado. La pregunta pregunta cómo recorrer los archivos en un directorio. El marcado 'duplicado' pregunta cómo enumerar todos los archivos en un directorio. Claramente diferente. ¿Por qué marcar como duplicado? – CJ7

Respuesta

13

Puede usar readdir o glob.

O bien, puede utilizar un módulo como Path::Class:

Ordinariamente children() no incluirá las entradas de auto y de los padres. y ... (o sus equivalentes en sistemas que no son de Unix), porque eso es como si yo fuera mi propio negocio. Si usted quiere todas las entradas de directorio que incluyen estos seres especiales, pasar un valor válido para el parámetro all:

@c = $dir->children(); # Just the children 
@c = $dir->children(all => 1); # All entries 

Además, hay un parámetro no_hidden que excluya todas las entradas normalmente "ocultos" - en Unix esto significa excluir todas las entradas que comienzan con un punto (.):

@c = $dir->children(no_hidden => 1); # Just normally-visible entries 

O Path::Tiny:

@paths = path("/tmp")->children; 
@paths = path("/tmp")->children(qr/\.txt$/); 

Devuelve una lista de objetos Path::Tiny para todos los archivos y directorios dentro de un directorio. Excluye "." y ".." automáticamente.

Si se proporciona un argumento qr// opcional, solo devuelve objetos para nombres secundarios que coinciden con la expresión regular dada. Sólo el nombre base se utiliza para la coincidencia:

@paths = path("/tmp")->children(qr/^foo/); 
# matches children like the glob foo* 

Obtener la lista de entradas de directorio en una desechos matriz algo de memoria (en lugar de obtener un nombre de archivo a la vez), pero con sólo unos pocos cientos de archivos , esto es poco probable que sea un problema.

Path::Class es portátil para sistemas operativos que no sean * nix y Windows. Por otro lado, AFAIK, sus instancias usan más memoria que las instancias Path::Tiny.

Si la memoria es un problema, es mejor utilizar readdir en un bucle while.

+0

y reead_dir elimina. y ... para usted, y si es necesario puede prefijar el directorio en el nombre de archivo –

43
#!/usr/bin/perl -w 

@files = <*>; 
foreach $file (@files) { 
    print $file . "\n"; 
} 

Dónde

@files = <*>; 

puede haber

@files = </var/www/htdocs/*>; 
@files = </var/www/htdocs/*.html>; 

etc.

+0

Esto no mostrará una lista de los archivos ocultos (aquellos que comienzan con un punto) en GNU/Linux y probablemente otros sistemas operativos similares. – josch

17

disfrutar.

opendir(DH, "directory"); 
my @files = readdir(DH); 
closedir(DH); 

foreach my $file (@files) 
{ 
    # skip . and .. 
    next if($file =~ /^\.$/); 
    next if($file =~ /^\.\.$/); 

    # $file is the file used on this iteration of the loop 
} 
+1

gracias! Yo usaría 'next if ($ file = ~ /^.+$/);' embargo, para evitar la segunda declaración;). – ashraf

+0

@ashraf regex tiene que ser /^\.+$/ en lugar de /^.+$/ – Rauf

+0

@Rauf sí, creo que tienes razón! :) – ashraf

Cuestiones relacionadas