• Publicidad

Lectura de directorios

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Lectura de directorios

Notapor issen » 2006-12-19 01:19 @096

Hola tengo un problema y espero que me puedan ayudar.
bueno,lo que necesito es leer un directorio y sus subdirectorios, pero no necesito leer todos los archivos, sólo los de algún tipo de extensión, es decir que tengo:

Código: Seleccionar todo
MI DIR
      |_ sound1.gsm
      |_ sound2.gsm
      |_ texto.txt
      |
      |_ MI SUB DIR
               |_ sound3.gsm
               |_ sound4.gsm
               |_ texto2.txt

Bueno, sólo necesito leer los .gsm y ponerlos en un hash que tenga como clave el nombre del archivo sin extensión y como valor la dirección + el archivo y su extensión osea la hash vendría a quedar de esta manera:
Código: Seleccionar todo
soun1 => /home/yussen/MI DIR/sound1.gsm
soun2 => /home/yussen/MI DIR/sound2.gsm
soun3 => /home/yussen/MI DIR/MI SUB DIR/sound3.gsm
soun4 => /home/yussen/MI DIR/MI SUB DIR/sound4.gsm

Ahora al momento de hacer el readdir() puedo hacer algún tipo de clasificación (si si, ¿cómo?) o tengo que leer todo el directorio y verificar los que me interesan del arreglo donde lo voy a guardar, luego y lo mas importante, ¿hay alguna forma de leer un directorio y sus subdirectorios de una sola pasada? y ¿cómo recupero las direcciones donde se encuentran con sus archivos? Ejemplo: /home/yussen/MI DIR/MI SUB DIR/sound4.gsm para que las ponga directamente en la hash.

Bueno, espero que este claro y que lo entienda y más aun que puedan ayudarme.
Desde ya, gracias
issen
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2006-12-06 09:05 @420

Publicidad

Notapor monoswim » 2006-12-19 07:54 @371

Si mal no recuerdo hay una variable de entorno que te dice la dirección de tu script, así que con eso + la dirección relativa de tu archivo ya tienes la ABSOLUTA...

Ahora bien, no conozco ninguna función que en el readdir() te traiga solo unos archivos, siempte yo traje todo y luego los bockeaba y en cada iteración con un if para ver si me servía el archivo...

Si tiene sub directorio que la función se llame a si misma y con eso haces la recursividad ;-)

Espero que te sirva

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor explorer » 2006-12-19 08:34 @398

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use Data::Dumper::Names;
use File::Find::Rule;
use File::Basename;
use strict;

my %ficheros_gsm;

foreach my $fichero ( File::Find::Rule->file->name('*.gsm')->in( '/home/yussen/MI DIR' ) ) {
  my ($nombre,$path,$sufijo) = fileparse( $fichero, ('.gsm') );
  $ficheros_gsm{ $nombre } = $fichero;
}

print Dumper \%ficheros_gsm;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
que se traduce por:
Para cada $fichero correspondiente a la búsqueda dentro del directorio '/home/yussen/MI DIR' y cuyo nombre siga el patrón '*.gsm',
dividimos el nombre completo del $fichero en $nombre del fichero, $sufijo y $path
y nos quedamos sólo con lo interesante

Sale:
Código: Seleccionar todo
%ficheros_gsm = (
                  'sound1' => '/home/yussen/MI DIR/sound1.gsm',
                  'sound3' => '/home/yussen/MI DIR/MI SUB DIR/sound3.gsm',
                  'sound4' => '/home/yussen/MI DIR/MI SUB DIR/sound4.gsm',
                  'sound2' => '/home/yussen/MI DIR/sound2.gsm'
                );

Vamos... 3 líneas... por algo nos gusta Perl, ¿no? :-)
Última edición por explorer el 2006-12-19 08:39 @402, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor issen » 2006-12-19 08:38 @401

Jejeje, bueno si estaba haciendo algo así, pero ¿cuál es esa variable que me almacena la dirección?, la verdad como yo ya conozco la dirección de donde tengo que leer pues la voy poniendo a los values del hash pero sería bueno saber para tener más conocimiento :P , además sería útil para la recursividad, jeje
Bueno, gracias y a ver si dices cual es la variable esa.
issen
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2006-12-06 09:05 @420

Expresión regular

Notapor issen » 2006-12-19 08:49 @409

Otra cosita. Bueno, para leer las extensiones de mis archivos para ver si me sirve pues estaba usando una expresión regular que es esta, bueno es una prueba:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$midato="archivo.gsm";

if($midato=~ /gsm$/){
     print "si tiene\n";
}else{
print "no tiene\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
así si funciona pero quería saber una cosa. ¿Cómo puedo hacer para que en la función se evalúe el .gsm? El problema es con el punto y la verdad he tenido ese problema en muchas ocasiones y siempre encontré alternativas y aunque así como hice la expresión funciona, por cultura general y además sé que me servirá más adelante, ¿cómo hago para que en una regexp evalúe el punto como parte de lo que estoy buscando y no como un comando de match?

Bueno desde ya gracias por toda la ayuda
issen
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2006-12-06 09:05 @420

Notapor issen » 2006-12-19 08:53 @412

Jajaja, explorer, esa está buenísima, ahora mismo la pruebo. ¡¡¡¡GRACIAS!!!!
issen
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2006-12-06 09:05 @420

Notapor issen » 2006-12-19 09:11 @424

Explorer, aunque tu solución parece re buena tengo un gran problema pues me sale que no puedo encontrar el Data/Dumper/Names.pm, ¿necesito alguna librería? y si es así, ¿de donde me la bajo?
Si me pudieras ayudar te lo agradecería mucho.
issen
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2006-12-06 09:05 @420

Notapor monoswim » 2006-12-19 09:33 @440

El problema del punto lo solucionas así

$midato=~ /\.gsm$/

El problema del data dumper es que debes instalar ese módulo desde el cpan...

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor issen » 2006-12-19 09:48 @450

Muchas muchas gracias. una cosita más. ¿De dónde me puedo bajar el cpan?
issen
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2006-12-06 09:05 @420

Notapor explorer » 2006-12-19 10:26 @476

Usa Data::Dumper, sino quieres instalar Data::Dumper::Names.

Mejor dicho, Data::Dumper en el ejemplo sólo sirve para mostrar el contenido de la variable con el método Dumper. Pero si no lo vas a usar en tu programa, puedes quitar esas líneas. Yo sólo las he puesto para demostrar cómo quedaría el hash al final.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron