2008-10-15 22 views
16

Estoy intentando recorrer todos los subdirectorios del directorio actual en Perl y obtener datos de esos archivos. Estoy usando grep para obtener una lista de todos los archivos y carpetas en el directorio dado, pero no sé cuál de los valores devueltos es un nombre de carpeta y cuál es un archivo sin extensión de archivo.¿Cómo distingue un archivo de un directorio en Perl?

¿Cómo noto la diferencia?

Respuesta

27

Se puede utilizar un operador de prueba archivo -d para comprobar si algo es un directorio. He aquí algunos de los operadores de prueba archivo de utilidad común

 
    -e File exists. 
    -z File has zero size (is empty). 
    -s File has nonzero size (returns size in bytes). 
    -f File is a plain file. 
    -d File is a directory. 
    -l File is a symbolic link. 

Ver perlfunc manual page for more

También, trate de usar File::Find que puede recursivamente directorios para usted. He aquí una muestra de lo que se ve en los directorios ....

sub wanted { 
    if (-d) { 
     print $File::Find::name." is a directory\n"; 
    } 
} 

find(\&wanted, $mydir); 
20
print "$file is a directory\n" if (-d $file); 
+0

Esto funcionó muy bien, gracias –

+1

La documentación de todas las funciones de comprobación de archivos se puede encontrar con "perldoc -f X" (que es bastante poco intuitivo, lo admitiré). –

4
 
my $dh = opendir("."); 
my @entries = grep !/^\.\.?$/, readdir($dh); 
closedir $dh; 

foreach my $entry (@entries) { 
    if(-f $entry) { 
     # $entry is a file 
    } elsif (-d $entry) { 
     # $entry is a directory 
    } 
} 
2

Sería más fácil de usar File::Find.

9

mirada a los operadores -X:

perldoc -f -X 

Para salto de directorio, utilice Archivo :: Buscar, o, si no eres un masoquista, usar mi archivo :: módulo siguiente que hace un iterador de usted y no requiere devoluciones de llamada locas. De hecho, puede hacer que File :: Next SÓLO devuelva archivos e ignore los directorios.

use File::Next; 

my $iterator = File::Next::files('/tmp'); 

while (defined (my $file = $iterator->())) { 
    print $file, "\n"; 
} 

# Prints... 
/tmp/foo.txt 
/tmp/bar.pl 
/tmp/baz/1 
/tmp/baz/2.txt 
/tmp/baz/wango/tango/purple.txt 

Es en http://metacpan.org/pod/File::Next

5
my @files = grep { -f } @all; 
my @dirs = grep { -d } @all; 
Cuestiones relacionadas