• Publicidad

Consulta sobre listado 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.

Consulta sobre listado de directorios

Notapor situ » 2012-11-16 19:22 @849

Estimados,
Los contacto porque estoy tratando de armar un explorador de archivos y hasta el momento no pude lograrlo, con algunos ejemplos de Internet.

Mi idea es listar el contenido de un directorio y de todos sus directorios.

Digamos el famoso árbol de directorios.

Sintáxis: [ Descargar ] [ Ocultar ]
  1. + directorio principal 
  2. -sub directorio 
  3.  -- archivo 1 
  4.  -- archivo 2 
  5. -sub directorio2 
  6.  -- archivo 3 

SAludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Publicidad

Re: Consulta sobre listado de directorios

Notapor explorer » 2012-11-16 20:45 @906

¿Y cuál es la pregunta?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Consulta sobre listado de directorios

Notapor situ » 2012-11-16 21:28 @936

Si alguien tiene un script de ejemplo.
Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Consulta sobre listado de directorios

Notapor situ » 2012-11-18 12:29 @562

Estuve probando este script:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use File::Find;
  2. use File::Basename;
  3.  
  4. @ARGV = qw(directorio) unless @ARGV;                    # directorio del que partimos
  5.  
  6. map { s|\\|/|g; $_ .= "/" unless (m|/$|) } @ARGV;       # A todos los directorios a procesar
  7.                                                         # le agregamos un '/' al final, si no lo tiene ya, y
  8.                                                         # cambiamos los '\' por '/'
  9.  
  10. @ARGV = sort @ARGV;                                     # Ordenación alfabética
  11.  
  12. for ( my ($index) = $#ARGV; $index > 0; $index-- ) {    # Para todos los directorios a procesar
  13.     if ( $ARGV[$index] =~ m|^$ARGV[$index-1]|i ) {      #   Si ese directorio es un subdirectorio del anterior
  14.         splice( @ARGV, $index, 1 );                     #     Lo sacamos del array (no lo procesaremos)
  15.     }
  16. }
  17.  
  18. map {s|:/$|:\\|} @ARGV;                                 # Caso de directorios MSDOS, restituímos el ':\' del principio
  19.  
  20. my ( $rhha, $f_DoNotInsert );
  21.  
  22. find( {                                                 # Búsqueda de todos los archivos y directorios
  23.     wanted     => \&TreatThisFile,                      # Ejecutamos esto cada vez que encontremos uno
  24.     preprocess => \&PreTreatThisDirectory,              # Ejecutamos esto antes de procesar un directorio
  25.     },
  26.     @ARGV                                               # Para todos los directorios
  27. );
  28.  
  29. foreach my $s_Directory (
  30.     sort { uc $a cmp uc $b } keys %$rhha
  31. ) {                                                     # Sacamos la estructura leída, a partir de las claves
  32.                                                         # del hash, ordenada alfabéticamente, sin importar
  33.                                                         # el tamaño de caja
  34.  
  35.     print "$s_Directory\n";                             # Bandera que indica si es un directorio
  36.  
  37.     foreach my $s_Extension (
  38.         sort { $a cmp $b } keys %{ $rhha->{$s_Directory} }
  39.     ) {                                                 # Ordenado según la extensión del archivo
  40.         foreach my $s_Filename (
  41.             sort { uc $a cmp uc $b } @{ $rhha->{$s_Directory}{$s_Extension} }
  42.         ) {                                             # Para todos los archivos
  43.             print "$s_Filename\n";                      # Imprimimos su nombre
  44.         }
  45.     }
  46. }
  47.  
  48. sub PreTreatThisDirectory {                             # Ejecuta esto por cada directorio
  49.  
  50.     $f_DoNotInsert = exists $rhha->{$File::Find::dir};  # No añadir el directorio si ya lo hicimos antes
  51.  
  52.     return @_;
  53. }
  54.  
  55. sub TreatThisFile {                                     # Ejecutar esto por cada archivo/directorio
  56.     my ($s_Path);
  57.     if ( -d ( $s_Path = $File::Find::name ) ) {         # Si es un directorio...
  58.     }                                                   # ... no hacemos nada
  59.     else {                                              # Si es un archivo...
  60.         my ( $s_Name, $s_Directory, $s_Extension )
  61.             = fileparse( $s_Path, '\.[^.]*' );          # Partimos toda la ruta en nombre del archivo,
  62.                                                         # el directorio y su extensión
  63.         push(                                                # Guardamos
  64.             @{ $rhha->{$s_Directory}{ uc $s_Extension } },   # el nombre del archivo en una estructura bidimensional,
  65.                                                              # según el directorio y la extensión que tuviera
  66.                 "$s_Name$s_Extension"
  67.         ) unless ($f_DoNotInsert);                           # excepto si ese directorio no hay que guardarlo
  68.     }
  69. }
  70.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Pero no me genera el árbol como lo quiero yo, y la verdad que no entiendo del todo el script.

Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Consulta sobre listado de directorios

Notapor explorer » 2012-11-18 12:56 @580

Te he comentado el script, y por lo que se ve, no hace lo que quieres hacer.

Pero si te vale para aprender alguna técnica, como extraer el nombre de un archivo, a partir de una ruta.

¡Inténtalo!
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Consulta sobre listado de directorios

Notapor situ » 2012-11-18 16:44 @738

¡Okas! Muchas gracias.

Igualmente voy a tener que buscar otro porque no termino de entender cómo adaptarlo a mi necesidad.

Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Consulta sobre listado de directorios

Notapor explorer » 2012-11-18 18:15 @802

Pero solo tienes que buscar un poco por Internet.

Por ejemplo, entrando en Google y buscando por "Perl dirtree" me salen unas cuantas referencias. Una de ellas tiene un código igual al que buscas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Consulta sobre listado de directorios

Notapor situ » 2012-11-18 21:35 @941

Muchas gracias.

Voy a molestarte nuevamente porque logré conseguir el script, pero quería consultarte cómo hacer lo siguiente:

Ya que ahora me imprime los archivos con extensión "html", quería que arriba de estos aparezca el nombre del directorio donde se encuentran. En este caso tengo dos directorios: "Routers" y el otro, "Firewall".

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use File::Find;
  2. use File::Basename;
  3. @ARGV = qw(Routers Firewall) if not @ARGV;
  4. find( \&doit, @ARGV );
  5.  
  6. sub doit {
  7.     $fpath = $File::Find::name;
  8.     $fname = basename($fpath);
  9.     if (m/(.*\.html)/) {
  10.         print "$fname";
  11.     }
  12. }
  13.  
  14.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡Muchas Gracias!
Última edición por explorer el 2012-11-18 22:14 @968, editado 1 vez en total
Razón: Faltaba unas '"' al final del print
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Consulta sobre listado de directorios

Notapor explorer » 2012-11-18 22:21 @973

Fíjate en el código que publicaste y en el código que te enlacé: dentro de la rutina que ejecuta find() se comprueba si estamos en un directorio, con el operador -d.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Consulta sobre listado de directorios

Notapor situ » 2012-11-19 08:29 @395

Claro, pero mi consulta era saber cómo hacer para que quede algo así, ya que los "títulos" están siendo pasados por argumento.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. Routers
  2.  reporte1.html
  3.  reporte2.html
  4. Firewall
  5.  reportefw.html
  6.  reportef2.html
  7.  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Siguiente

Volver a Básico

¿Quién está conectado?

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