• Publicidad

script copiar archivos XML de carpeta por mes

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

script copiar archivos XML de carpeta por mes

Notapor punkscp » 2011-10-14 15:32 @689

Saludos cordiales.

Tengo un pequeño problemón con un script que no me queda. Lo que deseo hacer es copiar todos los archivos XML, los cuales los tengo divididos en diferentes carpetas por fecha. Quiero hacer un acumulativo. Ejemplo:

C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPCH\BACKUP\XML\arc

Esta contiene carpetas año y mes. Ejemplo:

C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPCH\BACKUP\XML\arc\201101
C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPCH\BACKUP\XML\arc\201106

Dentro de estas carpetas están los archivos XML.

¿Cómo puedo hacer para que los archivos se copien en C:\XML?

Mi ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use File::Copy;
  4. use XML::Simple;
  5.  
  6. my @dir = qw{
  7. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPCH\BACKUP\XML
  8. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPCOMERMEX\BACKUP\XML
  9. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPCOR\BACKUP\XML
  10. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPGENERICO\BACKUP\XML
  11. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPIMS\BACKUP\XML
  12. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPSOR\BACKUP\XML
  13. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPWA\BACKUP\XML
  14. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPDICONSA\BACKUP\XML
  15. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPAEROVIAS\BACKUP\XML
  16. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPABARROTESRIV\BACKUP\XML
  17. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPCHEFMART\BACKUP\XML
  18. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPCOSTENA\BACKUP\XML
  19. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPESQUIVAR\BACKUP\XML
  20. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPGARCES\BACKUP\XML
  21. C:\EDIWIN\DOMINIOS\EDI\SALIDA\TEMPSUPERNETO\BACKUP\XML
  22. };
  23. # my @recentCFD = "";
  24. my $backup_dir = "./arc/";
  25. my ($sec,$min,$hour,$day,$month,$yr19,@rest) =   localtime(time);####### Obtiene la hora del sistema
  26. my $destdir="/cfd/569/".($yr19+1900);####### asigna directorio seguún el año en que se ejecute
  27. my @ERRORS="";
  28. my $newerr=0;
  29.  
  30. foreach my $dir (@dir){
  31.   chdir $dir ;
  32.   print "Cambiando de directorio a " . $dir . "\n";
  33.   my @files = <*.xml>;
  34.   foreach my $archivo (@files){
  35.         print $archivo, "\n";
  36.         #move ($archivo,"./arc/");
  37.                 my $ref = eval {XMLin($archivo)};
  38.                         if (!$@){
  39.                                 my $fech = $ref->{fecha};
  40.                                 my $anio = substr($fech,0,4);
  41.                                 my $mes = substr($fech,5,2);
  42.                        
  43.                                 if (! -d $backup_dir.$anio.$mes) {
  44.                         #      print "Directory: No.\n";
  45.                                   print "Creando directorio: $anio$mes:\n";
  46.                                   mkdir $backup_dir.$anio;
  47.                                 }    
  48.                                
  49.                                 # print $archivo," --> " ,$anio, $mes,"\n";
  50.                                 copy($archivo,$backup_dir . $anio . "/");
  51.                         }
  52.                         else
  53.                         {
  54.                                 print "Error procesando archivo: ",$archivo," \n";
  55.                                 rename $archivo,$archivo.".err";
  56.                         }
  57.         }
  58. }
  59.  
  60. sub myerr {
  61.   print "Error: \n";
  62.   print @ERRORS;
  63.   exit 0;
  64. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Si alguien me pudiera ayudar de favor.

¡Muchas gracias!
punkscp
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-05-06 23:26 @018

Publicidad

Re: script copiar archivos XML de carpeta por mes

Notapor explorer » 2011-10-15 11:14 @510

Yo usaría File::Find...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
find(
    sub {
        ... # proceso de copia
    },
    'C:/EDIWIN/DOMINIOS/EDI/SALIDA/TEMPCH/BACKUP/XML/arc'
);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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: script copiar archivos XML de carpeta por mes

Notapor punkscp » 2011-10-24 09:13 @425

Ahí sí ya no entendí cómo realizaría la búsqueda del archivo específico.

Si me lo pudieras simplificar ya, que no soy muy experto en Perl.

Muchas gracias.
punkscp
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-05-06 23:26 @018

Re: script copiar archivos XML de carpeta por mes

Notapor explorer » 2011-10-24 10:25 @476

Disculpa.

Yo creo que el programa está casi funcionando al 100%.

Veo mal la forma de indicar el directorio destino. Fíjate que en la línea 31 haces un chdir() para entrar en el directorio de los ficheros origen, lo cual es correcto, pero luego, en las líneas 46 y 50, $backup_dir es './arc/', indicando, con el punto, que es una ruta relativa a donde en ese momento te encuentras, por lo que vas a crear un subdirectorio arc/ dentro del mismo directorio en donde están los ficheros xml. Y en la 50, copiar el fichero dentro del directorio './arc/$anio/'. no sé si es así como lo quieres hacer.

Aquí hay otro problema: copy() necesita que el segundo argumento sea el nombre de un fichero, no nos vale con una simple ruta. Así, la línea 50 sería:

copy($archivo, $backup_dir . $anio . "/" . $archivo);

Otro error: la línea 43 es mejor escribirla así:
if (! -d "$backup_dir$anio/$mes") {

y aquí hay otro error más en la 46: estás creando el subdirectorio del año, pero no el del mes.

Si necesitas crear más de un nivel de profundidad de subdirectorios, lo recomendable es usar la función make_path() del módulo File::Path (o usar una condición -d más, seguida de otro mkdir()).
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: script copiar archivos XML de carpeta por mes

Notapor punkscp » 2011-10-24 15:06 @671

¡Muchas gracias!

Con la orientación que me diste del Find me quedó de la siguiente manera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use File::Find;
  5.  
  6. my $dir = 'C:/EDIWIN/DOMINIOS/EDI/SALIDA/';
  7.  
  8. find( \&imprimir_archivo_pl, $dir );
  9.  
  10. sub imprimir_archivo_pl {
  11.     my $elemento = $_;
  12.  
  13.     if ( -f $elemento && $elemento =~ /\.XML$/ ) {
  14.         print "$File::Find::name\n";
  15.     }
  16. }
  17.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


con esto llegue a la finalidad a crear un archivo de texto con dichos archivos XML el cual ejecuto

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl buscar.pl > XML.txt
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y me genera todos los XML que encuentre dentro de la carpeta indicada y subcarpetas.

Espero que a alguien le sea de ayuda =)
punkscp
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-05-06 23:26 @018

Re: script copiar archivos XML de carpeta por mes

Notapor punkscp » 2011-11-16 10:33 @481

Una pregunta: a este mismo script ¿cómo le puedo decir que los archivos que encontró con la extensión .XML los copie, por ejemplo, a una carpeta en C:\XML?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use File::Find;
  5.  
  6. my $dir = 'C:/EDIWIN/DOMINIOS/EDI/SALIDA/';
  7.  
  8. find( \&imprimir_archivo_pl, $dir );
  9.  
  10. sub imprimir_archivo_pl {
  11.     my $elemento = $_;
  12.  
  13.     if ( -f $elemento && $elemento =~ /\.XML$/ ) {
  14.         print "$File::Find::name\n";
  15.     }
  16. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


De antemano, agradezco la ayuda.
punkscp
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-05-06 23:26 @018

Re: script copiar archivos XML de carpeta por mes

Notapor explorer » 2011-11-16 12:26 @559

Con el módulo File::Copy puedes hacer operaciones básicas de copia y movimiento de ficheros.
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 0 invitados