Pregunta

Estoy tratando de 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 puedo notar la diferencia?

¿Fue útil?

Solución

Puede usar un operador de prueba de archivo -d para verificar si algo es un directorio. Estos son algunos de los operadores de prueba de archivos comúnmente útiles

    -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.

Consulte página del manual de perlfunc para obtener más información

Además, intente usar Archivo :: Buscar que puede repetir directorios por usted. Aquí hay una muestra que busca directorios ...

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

find(\&wanted, $mydir);

Otros consejos

print "$file is a directory\n" if ( -d $file );

Mire los operadores -X:

perldoc -f -X

Para el recorrido del directorio, use File :: Find o, si no es un masoquista, use mi módulo File :: Next, que crea un iterador para usted y no requiere devoluciones de llamada locas. De hecho, puede hacer que File :: Next SOLO 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

Está en http://metacpan.org/pod/File::Next

my @files = grep { -f } @all;
my @dirs = grep { -d } @all;
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
    }
}

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top