• Publicidad

Bajar ficheros con Net::FTP

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

Bajar ficheros con Net::FTP

Notapor mariomb19 » 2012-05-02 13:11 @591

Buenas, tengo un problema porque los resultados no me salen en letras y números.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use Net::FTP;
  4.  
  5. $ftp = Net::FTP->new( "xxx.xxx.xxx.xxx", Debug => 0 )
  6.     or die "Cannot connect to some.host.name: $@";
  7.  
  8. $ftp->login( "xxxxxx", 'xxxxxx' )
  9.     or die "Cannot login ", $ftp->message;
  10.  
  11. $ftp->get( "sapfi_rechazo_01032011_HCM_1724.txt.Z", "/home/rocco/sapfi_rechazo_01032011_HCM_1724.txt" )
  12.     or die "get failed ", $ftp->message;
  13. print "successful\n";
  14.  
  15. $ftp->quit;
  16.  
  17. open( MIFICH, "/home/rocco/sapfi_rechazo_01032011_HCM_1724.txt" ) || die "lo siento, no puedo encontrar fichero.txt\n";
  18.  
  19. my $archivo = "sapfi_rechazo_";
  20.  
  21. if ( $archivo =~ m/sapfi_rechazo_/ ) {
  22.  
  23.     while (<MIFICH>) {
  24.  
  25.         $cadena = "$_";
  26.  
  27.     }
  28.  
  29.     @cadena = split( /\|\s*/,, $cadena );
  30.     print "\n";
  31.     print $cadena[0];
  32.  
  33. }
  34. else {
  35.  
  36.     print "enviar correo";
  37. }
  38.  
  39. close(MIFICH);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
successful

��1�Pa2�       1`Ȁ�0`$�X#��"F�h��� ���GɌ'g�8IR�

Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-05-03 16:35 @733, editado 2 veces en total
Razón: Formateado de código con Perltidy y poner marcas Texto y Perl
mariomb19
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2012-04-30 09:39 @444

Publicidad

Re: Bajar ficheros con Net::FTP

Notapor explorer » 2012-05-02 16:04 @711

Estás recuperando un archivo .Z y lo guardas como .txt, pero no lo estás descomprimiendo.

La extensión .Z indica que el archivo está comprimido con el método compress. En CPAN puedes encontrar algún módulo que realice la descompresión. O usar alguna herramienta externa.
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

Descargar un directorio

Notapor mariomb19 » 2012-05-03 09:09 @423

Buenas. Actualmente estoy descargando archivo por archivo. Quisiera descargar todo el directorio, para descargar todos los txt. ¿Cómo lo hago? Gracias...

#!/usr/bin/perl -w

use Net::FTP;


$ftp = Net::FTP->new("xxx.xxx.xxx.xxx", Debug => 0)
or die "Cannot connect to some.host.name: $@";

$ftp->login("xxxxxxxx",'xxxxxxx')
or die "Cannot login ", $ftp->message;

$ftp->get("fi_sir_20100624_20100701.txt","/home/rocco/fi_sir_20100624_20100701.txt")
or die "get failed ", $ftp->message;
print "successful\n";

$ftp->quit;
mariomb19
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2012-04-30 09:39 @444

Re: Descargar un directorio

Notapor explorer » 2012-05-03 09:28 @436

Una forma sería hacer un listado de todos los archivos .txt posibles en el directorio, y luego hacer un bucle por todos ellos...

Pero otra forma más cómoda es la de usar el módulo Net::FTP::Recursive o Net::FTP::Recursive::AutoReconnect (que es lo mismo, pero con la opción de reconexión, en caso de corte).
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

Guardar archivos en cualquier carpeta

Notapor mariomb19 » 2012-05-03 15:47 @699

Buenas de nuevo, amigos. Tengo un problema para finalizar este script. Toda la información se baja bien pero no logro ponerlos en la carpeta que quiero. Siempre se guardan en la carpeta personal. Ayuda, por favor.

¿Cómo hago para que se guarden donde quiero?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use Net::FTP::Recursive::AutoReconnect;
  4.  
  5. my $host    = 'xxx.xxx.xxx.xxx';
  6. my $timeout = '10';
  7.  
  8. my $user = 'xxxxxxx';
  9. my $pass = 'xxxxxxx';
  10. my $ftp  = Net::FTP::Recursive::AutoReconnect->new( $host, Timeout => $timeout, Debug => 0 )
  11.     or warn "$user: Cannot connect to $host: $@";
  12. $ftp->login( $user, $pass ) or warn "$user $pass: Cannot login ", $ftp->message;
  13. $ftp->cwd("/") or warn "$user: Cannot change working directory ", $ftp->message;
  14. $ftp->rget( "/", "/home/rocco/dir2/" );
  15. my $writefh;
  16. my $fh;
  17. open( $fh, ">", \$writefh );
  18. binmode($fh);
  19. print $ftp->rdir( FilenameOnly => 1, Filehandle => $fh, PrintType => 1 );
  20. $ftp->quit;
  21. close($fh);
  22. print $writefh;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2013-06-21 09:32 @439, editado 2 veces en total
Razón: Formateado de código con Perltidy y poner marcas Perl
mariomb19
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2012-04-30 09:39 @444

Re: Guardar archivos en cualquier carpeta

Notapor explorer » 2012-05-03 16:09 @714

Los argumentos al método rget() no son los mismos que para el get().

De hecho, no necesitas ningún argumento, porque lo que hace es bajarse todos los archivos del servidor remoto al directorio local.

Para configurar el directorio local, supongo que valdrá con ejecutar una sentencia chdir() de Perl. Más información: perldoc -f chdir .

Si quieres que rget() se baje sólo los archivos .txt, debes incluir un argumento ParseSub que indique una función definida por ti, donde filtrarás los nombres de los archivos que realmente quieres que baje. Para saber cómo construir esa función, puedes mirar la que el módulo Net::FTP::Recursive::AutoReconnect usa por defecto: parse_files(), dentro del código del módulo.
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

rget (parsesub => &yoursub)

Notapor mariomb19 » 2012-05-08 09:17 @429

Buenas. Primero que nada disculpen la molestia, pero tengo una duda ¿cómo se construye la función rget() con parsesub() bien? Esta fue la que hice y no me sale. Quiero descargar solo los txt que indique.


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  #!/usr/bin/perl -w
  2.  
  3.  use Net::FTP::Recursive;
  4.  use File::chdir;
  5.  
  6.  
  7.     $ftp = Net::FTP::Recursive->new("xxx.xxx.xxx", Debug => 0);
  8.     $ftp->login("xxxxxx",'xxxxxx');
  9.     $CWD = "/";
  10.               {
  11.         local $CWD = "/home/rocco/dir2/";
  12.                   $fi_sir= "/fi_sir_*_*.txt && sapfi_rechazo_*_HCM_*.txt";
  13.                   my $regext= "$fi_sir";
  14.                   if($fi_sir =~ m/$fi_sir/){
  15.                   $ftp->rget(ParseSub => $regext)
  16.                   }
  17.                  
  18.               }
  19.     $ftp->quit;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-05-08 09:51 @452, editado 1 vez en total
Razón: Poner bien las marcas Perl
mariomb19
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2012-04-30 09:39 @444

Re: rget (parsesub => &yoursub)

Notapor explorer » 2012-05-08 11:49 @534

Ya te dije que usar este módulo es algo complicado...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use Net::FTP::Recursive;
  3.  
  4. my $ftp = Net::FTP::Recursive->new(          # conexión
  5.     'servidor',
  6.     Debug => 1,                              # ver qué está haciendo
  7. );
  8.  
  9. $ftp->login('usuario', 'clave');             # registro
  10.  
  11. chdir '/home/explorer/Documentos/temp/kk';   # nos colocamos en el directorio donde dejaremos los archivos
  12.  
  13. $ftp->cwd('/home/rocco/dir2/');              # directorio en el servidor remoto
  14.  
  15. $ftp->rget(ParseSub => \&filtrar_archivos);  # bajar archivos
  16.  
  17.  
  18. sub filtrar_archivos {                       # en @_ tenemos el listado (ls -l) de archivos a bajar
  19.     my @a_descargar;
  20.  
  21.     for my $linea_listado (@_) {                        # para todas las líneas del listado
  22.         # saltamos a la
  23.         # siguiente línea si no corresponde con el patrón del archivo que buscamos
  24.         next if $linea_listado !~ / ((fi_sir|sapfi_rechazo_.*?_HCM_).*?\.txt)/;
  25.  
  26.         my $archivo = $1;                    # nos quedamos solo con el nombre del archivo, capturado antes
  27.  
  28.         my $file = Net::FTP::Recursive::File->new(
  29.             plainfile => 1,                             # archivo normal
  30.             filename  => $archivo,                      # con este nombre
  31.         );
  32.  
  33.         push @a_descargar, $file;
  34.     }
  35.  
  36.     return @a_descargar;                     # devolvemos los archivos a bajar
  37. }
  38.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

El verdadero trabajo es el del patrón de las expresiones regulares.

Es: / ((fi_sir|sapfi_rechazo_.*?_HCM_).*?\.txt)/, que quiere decir: «busca un carácter de espacio en blanco, y lo que sigue debe coincidir con 'fi_sir' o con 'sapfi_rechazo_', seguido de unos caracteres más, inmediatamente seguidos por '.txt'. Con los paréntesis de captura nos quedamos con el nombre del archivo y lo guardamos en $1».

Esto se puede simplificar mucho si sabemos algo más de las condiciones iniciales.

Por ejemplo, si sabemos que los únicos archivos que nos interesan dentro del directorio destino acaban en '.txt', entonces la línea queda así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         next if $linea_listado !~ /(\S+\.txt)/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En este caso, usamos '\S+' para indicar «cualquier carácter que no es un carácter de espacio en blanco», así que estamos capturando cualquier archivo que termine en '.txt'.
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

Re: Bajar ficheros con Net::FTP

Notapor mariomb19 » 2012-05-10 15:17 @678

Buenas tardes, amigo. Tengo un problema. Me sirvió en parte el código, pero el problema es que me sale este error ya lo he intentado de solucionar de varias formas, pero no he podido. Esto es lo que sale:

Net::FTP::Recursive=GLOB(0xa1b0220)>>> PWD
Net::FTP::Recursive=GLOB(0xa1b0220)<<< 257 "/" is current directory.
Retrieving fi_sir_20100624_20100701.txt.
Net::FTP::Recursive=GLOB(0xa1b0220)>>> PORT 161,196,16,23,132,21
Net::FTP::Recursive=GLOB(0xa1b0220)<<< 200 PORT command successful.
Net::FTP::Recursive=GLOB(0xa1b0220)>>> RETR fi_sir_20100624_20100701.txt
Net::FTP::Recursive=GLOB(0xa1b0220)<<< 550 fi_sir_20100624_20100701.txt: No such file or directory.
Retrieving fi_sir_20100625_20100702.txt.
Net::FTP::Recursive=GLOB(0xa1b0220)>>> PORT 161,196,16,23,138,220
Net::FTP::Recursive=GLOB(0xa1b0220)<<< 200 PORT command successful.
Net::FTP::Recursive=GLOB(0xa1b0220)>>> RETR fi_sir_20100625_20100702.txt
Net::FTP::Recursive=GLOB(0xa1b0220)<<< 550 fi_sir_20100625_20100702.txt: No such file or directory.
Retrieving fi_sir_20101216_20101223.txt.
Net::FTP::Recursive=GLOB(0xa1b0220)>>> PORT 161,196,16,23,236,250
Net::FTP::Recursive=GLOB(0xa1b0220)<<< 200 PORT command successful.
Net::FTP::Recursive=GLOB(0xa1b0220)>>> RETR fi_sir_20101216_20101223.txt
Net::FTP::Recursive=GLOB(0xa1b0220)<<< 150 Opening ASCII mode data connection for fi_sir_20101216_20101223.txt (0 bytes).
Net::FTP::Recursive=GLOB(0xa1b0220)<<< 226 Transfer complete.
Retrieving fi_sir_20101217_20101224.txt.
Net::FTP::Recursive=GLOB(0xa1b0220)>>> PORT 161,196,16,23,212,23
Net::FTP::Recursive=GLOB(0xa1b0220)<<< 200 PORT command successful.
Net::FTP::Recursive=GLOB(0xa1b0220)>>> RETR fi_sir_20101217_20101224.txt
Net::FTP::Recursive=GLOB(0xa1b0220)<<< 150 Opening ASCII mode data connection for fi_sir_20101217_20101224.txt (0 bytes).
Net::FTP::Recursive=GLOB(0xa1b0220)<<< 226 Transfer complete.
Retrieving fi_sir_20120219_20120226.txt.
Net::FTP::Recursive=GLOB(0xa1b0220)>>> PORT 161,196,16,23,220,199
Net::FTP::Recursive=GLOB(0xa1b0220): Timeout at /home/rocco/Documentos/proyecto/script_fi.pl line 19.
Retrieving fi_sir_20120220_20120227.txt.
Net::FTP::Recursive=GLOB(0xa1b0220)>>> PORT 161,196,16,23,220,199
Net::FTP::Recursive: Unexpected EOF on command channel at /home/rocco/Documentos/proyecto/script_fi.pl line 19.
Retrieving fi_sir_20120221_20120228.txt.
Retrieving fi_sir_20120222_20120229.txt.
Retrieving fi_sir_20120223_20120301.txt.
Retrieving fi_sir_20120224_20120302.txt.
Retrieving fi_sir_20120225_20120303.txt.

Me tarda mucho y no baja todo los archivos.
mariomb19
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2012-04-30 09:39 @444

Re: Bajar ficheros con Net::FTP

Notapor explorer » 2012-05-10 17:05 @753

Los mensajes tipo
550 fi_sir_20100624_20100701.txt: No such file or directory.

quiere decir que ese archivo no está en el directorio remoto (veo que lo tienes en "/").

¿No será que está en un subdirectorio? Entonces hay que ampliar el código para que el módulo pueda entrar en esos directorios. Como te he indicado antes, en el código de Net::FTP::Recursive::AutoReconnect está el ejemplo.

El error
Timeout at /home/rocco/Documentos/proyecto/script_fi.pl line 19.

dice que el servidor FTP no responde a tu petición.
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 0 invitados

cron