• Publicidad

Función recursiva para listar contenido de un directorio

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

Re: Función recursiva para listar contenido de un directorio

Notapor explorer » 2009-11-09 16:10 @715

Te he dicho que las líneas 13 y 18 estaban mal.

Haciendo el cambio, a mi sí que me funciona (lo he adaptado a mi Linux)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:/Perl64/bin/perl.exe -w
  2. sub buscarxtitulo {
  3.     my ($directorio, $parametro)  = @_;
  4.  
  5.     opendir DIR, $directorio     or die "ERROR: al abrir el directorio $directorio: $!\n";
  6.     my @archivos = readdir DIR;
  7.     close   DIR;
  8.  
  9.     foreach $archivo (@archivos) {
  10.         next if $archivo eq "."  or  $archivo eq "..";
  11.  
  12.         my $fichero = "$directorio/$archivo";
  13.  
  14.         if (-f $fichero) {
  15.             if ($archivo =~ /$parametro/io) {
  16.                 print "Encontrado: $fichero\n";
  17.             }
  18.         }
  19.         elsif (-d $fichero) {
  20.             buscarxtitulo($fichero, $parametro);
  21.         }
  22.     }
  23. }
  24.  
  25. open(D,"Datos.txt");
  26. chomp(($directorio, $parametro, $tipo) = <D>);
  27. print "$directorio\n$parametro\n$tipo\n";
  28. close(D);
  29.  
  30. if ($tipo eq 'Titulo') {
  31.     buscarxtitulo($directorio, $parametro);
  32. }
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4

Con el fichero de Datos.txt:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
/home/explorer
print
Titulo
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

me salen todos los ficheros en cuyo nombre aparece la palabra 'print'.

He usado una variable más, para ahorrar escritura, y para diferenciar los dos usos: uno con el nombre de solo el $archivo, y otro, con toda la ruta del $fichero.
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Función recursiva para listar contenido de un directorio

Notapor Alex0520 » 2009-11-09 21:11 @924

Gracias, explorer, que pena tanta preguntadera, jajajaja.

Otra pregunta, es que tengo que mostrar propiedades de los archivos encontrados; dentro de esas propiedades está el directorio donde está, el tamaño, la fecha de la última modificación, y el nombre... ¿Con qué funciones o métodos puedo acceder a esa información?
Última edición por explorer el 2009-11-10 03:11 @174, editado 1 vez en total
Razón: Ortografía
Alex0520
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2009-11-09 08:49 @409

Re: Función recursiva para listar contenido de un directorio

Notapor explorer » 2009-11-10 03:27 @185

Con la función stat() y los operadores de condición de ficheros.

Hay que mirar más en la documentación... ¿eh?
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Función recursiva para listar contenido de un directorio

Notapor Alex0520 » 2009-11-13 15:04 @669

Hola, explorer.

Muchas gracias por tu ayuda; ya pude listar parte de la información que necesito, pero ahora tengo un problema: no sé cómo mostrar solamente el nombre del archivo y solamente el directorio donde está el archivo.

Por ejemplo: la función retorna C:\Users\Administrator\Documents\123.txt y necesitaría mostrar solamente C:\Users\Administrator\Documents y aparte 123.txt.

¿Alguna sugerencia?

Gracias
Alex0520
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2009-11-09 08:49 @409

Re: Función recursiva para listar contenido de un directorio

Notapor erv-Z » 2009-11-13 16:29 @729

A ver, dime cómo se ejecuta el código, y te doy una mano.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Función recursiva para listar contenido de un directorio

Notapor explorer » 2009-11-13 17:55 @788

Cambia la línea 16:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 print "Encontrado: $fichero\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 print "Encontrado: $archivo\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Función recursiva para listar contenido de un directorio

Notapor Alex0520 » 2009-11-14 23:01 @001

Hola, explorer. Muchas gracias por tu pronta respuesta; como soy nuevo me asaltan muchas dudas, les vengo con una nueva.

Creé el script con la función que muy amablemente ustedes me ayudaron a programar, y como ustedes ven en el código el script lee los parámetros de un archivo.

Y me surge un problema: si le doy doble clic al script corre de maravilla, funciona y excelente, pero si lo quiero ejecutar desde la consola de comandos de Windows con la sentencia

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
C:\Perl64\bin\perl.exe C:\Users\Administrator\Desktop\Buscador1.pl
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

No me funciona porque según eso no puede leer los parámetros del archivo. ¿Qué pasará?
Gracias...
Alex0520
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2009-11-09 08:49 @409

Re: Función recursiva para listar contenido de un directorio

Notapor explorer » 2009-11-15 12:30 @562

El problema es que los programas de ordenador pueden ser ejecutados en un directorio distinto de donde residen. Y trabajar en un tercer directorio.

Repito: en la ejecución de un programa hay que tener en cuenta
  • Dónde reside
  • Desde dónde lo estamos ejecutando
  • Dónde está trabajando.

El dónde reside lo tenemos claro. Es donde está grabado en el disco. Por ejemplo: C:\Users\Administrator\Desktop\Buscador1.pl

El dónde lo estamos ejecutando es el directorio desde donde lanzamos. Por ejemplo, podemos estar en C:\ y desde allí lanzarlo con C:\Perl64\bin\perl.exe C:\Users\Administrator\Desktop\Buscador1.pl. Mientras esté funcionando el programa, seguiremos estando en C:\. No nos hemos desplazado a C:\Users\Administrator\Desktop\Buscador1.pl.

Y el lugar donde estamos trabajando es el directorio donde, en cada momento, el programa ha decidido entrar para trabajar con los ficheros que allí mismo están.

Importante: cuando arranca el programa, el directorio de trabajo es el directorio desde donde lo hemos lanzado.

Dentro de un programa, cuando está funcionando, podemos referirnos a un fichero de dos formas distintas:
* De forma absoluta. Si la trayectoria al fichero empieza con '/' (en sistemas UNIX y Windows) o con '\' o 'C:\' (en sistemas Windows) le estamos dando una trayectoria absoluta al fichero. Ejemplo: C:\Users\Administrator\Desktop\Datos.txt

* De forma relativa. Es cuando no indicamos la trayectoria completa al fichero. Puede ser un nombre de fichero solo: 'Datos.txt', con lo que nos estamos refiriendo a un fichero llamado 'Datos.txt' que resida en el directorio de trabajo del programa. También puede ser con una trayectoria relativa: '../Datos.txt' nos refiere a un fichero que está en un nivel superior a donde estamos trabajando.

Este último punto es importante: si indicamos el acceso al fichero de forma relativa, lo estamos haciendo respecto del directorio de trabajo.

Ejemplo: supongamos que tenemos un programa llamado kk.pl en C:/Documentos/Desarrollo/. Abrimos una ventana de línea de comandos y nos situamos en C:/Documentos. Tenemos dos formas básicas de arrancarlo:

perl C:/Documentos/Desarrollo/kk.pl
perl ./Desarrollo/kk.pl


El programa es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use Cwd;
  7.  
  8. print "Trabajo: ", cwd,       "\n";
  9. print "Actual:  ", $ENV{PWD}, "\n";
  10.  
  11. if (open KK, "<kk.pl") {
  12.     print "Sí que lo encuentro.\n";
  13.     close KK;
  14. }
  15. else {
  16.     warn "No encuentro a kk.pl";
  17. }
  18.  
  19. chdir 'Desarrollo';
  20.  
  21. print "Trabajo: ", cwd,       "\n";
  22. print "Actual:  ", $ENV{PWD}, "\n";
  23.  
  24. if (open KK, "<kk.pl") {
  25.     print "Sí que lo encuentro.\n";
  26.     close KK;
  27. }
  28. else {
  29.     warn "No encuentro a kk.pl";
  30. }
  31.  
  32. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y la salida es
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Trabajo: /home/explorer/Documents
Actual:  /home/explorer/Documents
No encuentro a kk.pl at ./Desarrollo/kk.pl line 16.
Trabajo: /home/explorer/Documents/Desarrollo
Actual:  /home/explorer/Documents
Sí que lo encuentro.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

(El módulo Cwd nos devuelve el directorio de trabajo en ese momento)

Observamos que el primer intento falla: el programa no es capaz de encontrarse a sí mismo. Es debido a que el programa reside dentro del directorio Desarrollo, pero en el primer intento vemos que seguimos estando en el directorio desde donde lo hemos lanzado. Después, con la ayuda de chdir() entramos en el directorio Desarrollo y ya le encontramos. Y vemos que ahora el directorio de trabajo ya es distinto del directorio de donde partíamos.

Naturalmente, también podríamos habernos referido al fichero sin tener que desplazarnos al lugar donde está. Así:

open KK, "<./Desarrollo/kk.pl"
open KK, "<Desarrollo/kk.pl"


Las dos son formas válidas para referirnos de forma relativa a la posición donde se encuentra el fichero.

La recomendación es usar dos formas básicas para trabajar con ficheros:
* Al principio del programa, hacer un chdir() para entrar en el directorio donde están los ficheros. Si chdir() falla es que no existe ese directorio, y terminamos con error. Si no hay error, podemos referirnos a los ficheros sin indicar trayectoria ninguna. Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
chdir 'C:/Users/Administrator/Desktop';
open D,'Datos.txt' or die "ERROR: No pude abrir el fichero Datos.txt: $!\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* Nos referimos siempre a los ficheros de forma absoluta, si no estamos seguros de que el programa se lanza siempre desde el mismo sitio. O relativa, de lo contraria. Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# En Windows se puede indicar el directorio de trabajo de los programas que lanzamos
# con doble clic o por medio de Tareas programadas o Servicios Windows. Suponemos que
# indicamos que Buscador1.pl tendrá como directorio de trabajo C:/Users/Administrator/Desktop
open D,'Datos.txt' or die "ERROR: No pude abrir el fichero Datos.txt: $!\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En esta segunda variante también está la opción de indicar el camino absoluto al fichero (si lo conocemos, por lo que entonces nos da igual dónde se ejecute el programa y cuál sea el directorio de trabajo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open D,'C:/Users/Administrator/Desktop/Datos.txt' or die "ERROR: No pude abrir el fichero C:/Users/Administrator/Desktop/Datos.txt: $!\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

(Observar que, SIEMPRE, en las operaciones de ficheros, hay una comprobación de que hemos podido abrir el fichero. Si no, nos morimos indicando el porqué (el valor de la variable $!)).

El elegir una forma u otra, pues depende un poco del tipo de trabajo o circunstancia. Yo suelo usar siempre la primera opción cuando los programas son muy grandes, pues en esos casos es más normal que haya que trabajar con ficheros que están en otro sitio.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados