¿Cómo distingo un archivo de un directorio en Perl?
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?
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
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
.