• Publicidad

Búsqueda de fechas y comparación de archivos

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

Re: Búsqueda de fechas y comparación de archivos

Notapor mvil1984 » 2009-07-23 17:11 @758

¿Cómo sería lo del canal? Más detalles, ¿necesito de una clave, o un enlace, cómo busco los canales? O con esos links que me pasó funciona? Otra consulta. ¿Se puede limitar el uso de memoria o CPU en Perl para que cuando se ejecute no consuma tantos recursos? Esto debido a que otros procesos tienen prioridad, entonces es para limitar el uso de los recursos que consume Perl en Windows.
mvil1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2009-07-17 15:10 @674

Publicidad

Re: Búsqueda de fechas y comparación de archivos

Notapor explorer » 2009-07-23 18:49 @825

Tienes que usar algún programa de Chat o IRC para conectarte. Luego, busca por los servidores, te conectas a alguno de los que te indiqué. Por ejemplo, los de irc.perl.org son gratuitos. Y cuando estás dentro de un servidor ya puedes solicitar la lista de canales o entrar directamente si sabes su nombre (los canales son los que empiezan por '#'.

Si no puedes conectarte, mándame por correo privado tu acceso de mensajería instantánea y te llamo desde el mío.

En cuanto al consumo de recursos, creo que Windows no tiene forma de restringir esos consumos, no al menos de forma tan fácil como se puede hacer en Linux. De hecho, el error es usar Windows para desarrollo de este tipo de tareas. Windows está muy bien para jugar y escribir cartas, pero para lo demás...

En cuanto al consumo de recursos, Perl consume bastante, debido al pobrísimo sistema de gestión de memoria en Windows. Por algún hilo ya he puesto un programa que tarda en ejecutarse 40 minutos en Windows XP y 40 centésimas de segundo en Linux (con el mismo hardware).

Sí que hay forma de aumentar la prioridad de los procesos: desde la ventana de Gestión de Tareas. Siendo Administrador del sistema, puedes aumentar esa prioridad.
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: Búsqueda de fechas y comparación de archivos

Notapor mvil1984 » 2009-07-23 19:50 @868

Muchas Gracias, explorer. En realidad has sido de mucha ayuda, si bien no soy un gran experto puedes notar que estoy interesado en aprender Perl, pero no estoy en el potencial como para poder emitir una opinión de que tan bueno es Perl y cuáles son las ventajas que éste me da.

Por otro lado, Sigo sin entender que tipo de programa necesito para conectarme al Chat, pero bueno, estoy atento a tus indicaciones para proceder.

Otra cosa, explorer, he estado viendo que eres de España y vi el enlace de las posibilidades de trabajo, me gustaría que me informes de ello, porque en un futuro me gustaría ir a España a trabajar, entonces infórmame de ello porque el país en el que vives siempre me ha gustado.


Gracias de antemano.
Última edición por mvil1984 el 2009-07-24 08:59 @416, editado 1 vez en total
mvil1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2009-07-17 15:10 @674

Re: Búsqueda de fechas y comparación de archivos

Notapor explorer » 2009-07-24 04:23 @224

Recuerda que si no sabes algo, lo puedes encontrar en Wikipedia:

* Protocolo IRC. ¿Qué es?

* Clientes de IRC

Cuando usaba Windows, hace ya muchos años, usé el mIRC. Hoy en día uso XChat en Linux, que veo que además también está disponible para Windows.

También, como opción, está el instalar el Chatzilla, una extensión para el navegador Firefox.

No dejes datos personales, como el correo, publicado en los foros, porque te lo cazarán los robots de SPAM y tu buzón acabará lleno de correo basura.

Reedita tu mensaje y borra ese dato. Si quieres enviarme información privada usa el sistema de mensajería privada que hay en estas páginas (arriba, donde dice "mensajes privados").

En cuanto a lo de venir a España, no tengo ni idea de cómo se puede hacer. Te puedo contar alguna cosa de cómo está la situación aquí y cómo se vive, pero eso ya te lo contaré en el chat.
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: Búsqueda de fechas y comparación de archivos

Notapor mvil1984 » 2009-07-24 16:10 @715

Buenas explorer, he encontrado la manera de hacerlo. Muchas Gracias

Ahora voy por la segunda parte, encontrar el archivo no procesado en alguna ruta y que me devuelva su nombre y ruta y lo escriba en el archivo, hasta el momento llevo algo así, si me puedes orientar.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use POSIX qw/ strftime /;
  2. use Getopt::Std;
  3. use Time::Local;
  4. use File::Find;
  5.  
  6.  
  7. # -f: Patron de los archivos a validar.
  8. # -d: Indica el directorio a buscar archivos.
  9. # -n: Nombre Archivo Generar.
  10. # -r: Ruta del archivo a buscar
  11.  
  12. ## Asignacion de variables globales
  13. getopts ("f:d:n:r:");
  14. if ((!defined($opt_f)) || (!defined($opt_d)) || (!defined($opt_n)) || (!defined($opt_r))) {
  15.   print "Programa que fechas en los archivos de ECS y determina si su fecha es correcta\n\n";
  16.   exit;
  17. }
  18.  
  19. print "--Inicio--\n\n";
  20.  
  21. ##      Declaracion variables
  22. $sArchivos       =$opt_f;
  23. $sDirectorio     =$opt_d;
  24. $sNombreBase     =$opt_n;
  25. $sRuta           =$opt_r;
  26. my @procesado;
  27. my @no_procesado;
  28. my @busqueda;
  29. my $mtime="";
  30. my $ruta = $opt_r;
  31.  
  32.  
  33. ## Calculo del Tiempo
  34. print "La fecha de hoy es: ",scalar localtime();
  35.  
  36. my @ayer = localtime( time() - 86_400 );
  37. my $time = timelocal(0,0,18,@ayer[3..5]);
  38.  
  39. ## Imprimimos la ruta
  40. print "\nDirectorio:$sDirectorio\n";   
  41.  
  42. ## Nombre del archivo con fecha
  43. $sFecha=strftime( "%d-%m-%Y.%H.%M.%S", localtime(time) );
  44. $ArchivoResumen=$sNombreBase."+".$sFecha.".txt";
  45.  
  46. #Separacion de los patrones
  47. @Patrones=split(/\\/,$sArchivos);
  48.  
  49. #Recorrido de los patrones
  50. foreach $Patron (@Patrones)
  51. {
  52.        
  53.         @Archivos=<$opt_d\\$Patron>;    
  54.         $Cantidad=$#Archivos + 1;
  55. print "===========================================================\n";
  56. print "Patron:$Patron\n";      
  57. print "Cantidad:$Cantidad\n";  
  58.  
  59. #Recorre el arreglo de archivos
  60.         foreach $Archivos (@Archivos)
  61.         {
  62.         $iContador=0;
  63.        
  64. print "cONT:$iContador\n";                     
  65.                                        
  66.                 #Separa la ruta
  67.                 @NombreEspecifico=split(/\\/,$Archivos);
  68.                        
  69.                 #Extrae el nombre donde se registra el resumen archivo resumen
  70.                 #aqui va la vara del archivo
  71.                 $NombreArchivo=$NombreEspecifico[$#NombreEspecifico];
  72.                
  73.                 print "--------------------------------\n";            
  74.                 print "Archivo-Ruta:$Archivos\n";
  75.                        
  76.                                                
  77.                 $mtime = (stat("$Archivos"))[9];        # Obtenemos la fecha de modificacion del fichero
  78.                 print "La fecha de modificacion es:", scalar localtime($mtime);
  79.                 print "\n";
  80.                 my $texto = "$Archivos           ".scalar localtime($mtime);
  81.                                
  82.                 if ($mtime > $time)             # Segun el $mtime lo guardamos en un sitio u otro del arreglo
  83.                 {
  84.                        
  85.                         push (@procesado, $texto);      # Insertamos los procesados en el arreglo
  86.                         #print "@procesado";
  87.                 }
  88.                 else
  89.                 {
  90.                        
  91.                         push (@no_procesado, $texto);   # Insertamos los no procesados en el arreglo
  92.                         #print "@no_procesado";
  93.                         find(\$Archivos,$ruta);
  94.                         my $btime = (stat("$ruta/$Archivos"))[9];
  95.                         print "El archivo $Archivos se encuentra en la ruta $File::Find::name" if ($btime > $time);
  96.                 }
  97.                
  98.                
  99.        
  100.        
  101. #-----------------------------------------------------         
  102.                
  103.         }
  104.  
  105.        
  106. }              
  107.  
  108.  
  109.  
  110. ## Escribimos en el archivo
  111. open(RESUMEN,">>$ArchivoResumen") or die "Imposible abrir archivo: '$ArchivoResumen': $!\n";
  112.  
  113. print RESUMEN "MONITOREO \n";
  114. print RESUMEN '=' x 60,"\n";
  115. print RESUMEN "\n\nARCHIVOS PROCESADOS\n";
  116. print RESUMEN '=' x 40,"\n";
  117. print RESUMEN join ("\n\n", @procesado), "\n";
  118. print RESUMEN "\n\nARCHIVOS NO PROCESADOS\n";
  119. print RESUMEN '=' x 40,"\n";
  120. print RESUMEN join ("\n\n", @no_procesado), "\n";
  121. print RESUMEN "\n\nBUSQUEDA DE ARCHIVOS NO PROCESADOS\n";
  122.  
  123. close(RESUMEN);
  124.  
  125. print "--Salida--\n";
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4



Luego el archivo el bat que lo llama es el siguiente:


Sintáxis: [ Descargar ] [ Ocultar ]
  1. net use q: "\\195.195.195.195/prueba" 
  2.  
  3. prueba.pl -f"*.PGC" -d"C:/directoriodeprueba" -n"MI" -r"q:/test" 
  4.  
  5. net use q: /delete 
  6.  
  7. pause 


¿Puedes ayudarme u orientarme sobre cómo hacerlo? Creo que es fácil con este comando de find(), no sera nada difícil.

Gracias
Última edición por explorer el 2009-07-24 16:25 @725, editado 1 vez en total
Razón: Tienes que acostumbrarte a etiquetar las secciones de código
mvil1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2009-07-17 15:10 @674

Re: Búsqueda de fechas y comparación de archivos

Notapor explorer » 2009-07-24 16:43 @738

¿Realmente estás usando el módulo File::Find? Yo creo que no... Lo que veo es que estás usando el operador '< ... >'. La línea 93 me sobra. Y el print() de la 95, en vez de $File::Find::name, es lo mismo que "$ruta/$Archivos" (lo que pone en la 94).

File::Find sirve para buscar uno o más ficheros que cumplan una serie de condiciones. Pero es que eso es lo que estás haciendo a lo largo del código. No estás usando bien el módulo.

Con el operador '< ... >' te vale para sacar el directorio, si los ficheros están en ese directorio (no repartidos entre subdirectorios).

Decir
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$Cantidad = $#Archivos + 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

es lo mismo que
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$Cantidad = @Archivos;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No necesitas volver a hacer un stat() del fichero en la línea 94 porque ya lo hiciste en la línea 77. El valor de $btime lo tienes en $mtime. El print() de la línea 95 nunca se cumple ($mtime es menor que $time).

¿Para qué sirve la variable $iContador? Creo que no se usa para nada.

En resumen... que está un poco enmarañado...

Y aún me tiene mosca el que no haya funcionado lo de opendir(). A mí, en mi máquina, me funciona.

Y te pido por favor que etiquetes las secciones de código de tus mensajes.
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: Búsqueda de fechas y comparación de archivos

Notapor mvil1984 » 2009-07-24 16:58 @749

Mi intención es que busque ese mismo archivo pero en otra ruta de otros servidores, debido a que debe ser encontrado, una vez ubicado, debe tomar de nuevo la fecha de modificación debido a que el archivo que debe buscar sí debe cumplir esa condición de fecha de modificación mayor a la fecha actual. Porque la idea es que si no está donde estoy buscando, necesito que busque en otras rutas y sus subdirectorios el archivo; una vez ubicado sacar su fecha de modificación y comparar de nuevo para saber si cumple la condición imprimir el archivo en el archivo de texto diciendo que lo encontró en una ruta X, y luego de eso si no lo encontró de modo que cumpliera esa condición que busque en el otro servidor y haga lo mismo y si no lo encuentra que diga que no se encontró y finalice ahí, eso sería.

Disculpas por lo del código, no sabía cómo documentarlo porque no había visto las opciones que tenía cuando escribía.

Gracias.
mvil1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2009-07-17 15:10 @674

Re: Búsqueda de fechas y comparación de archivos

Notapor explorer » 2009-07-24 17:10 @757

Entonces, entendido. Sí que necesitas usar el find() para buscar el fichero en otros sitios...

Pero...

Resulta que estás usando el módulo File::Find de una forma que no está documentada. ¿En qué parte de la documentación de File::Find::find() se dice que el primer parámetro de la función puede ser una referencia a una variable escalar que contiene un valor?

Que funcione el módulo, es otra cosa que, además, voy a investigar ahora. Pero que funcione en el futuro, en las siguientes versiones de File::Find, lo veo difícil.

Actualización: como me temía, a mí me falla tu programa: me dice que "\$Archivos" como primer parámetro de File::Find::find() no es válido porque no es una referencia a un código ejecutable.
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: Búsqueda de fechas y comparación de archivos

Notapor mvil1984 » 2009-07-24 17:22 @765

¿Cómo puedo solucionar el problema?
mvil1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2009-07-17 15:10 @674

Re: Búsqueda de fechas y comparación de archivos

Notapor explorer » 2009-07-24 17:40 @777

A ver... hay varias opciones...

* Si realmente no sabes dónde están los ficheros en los servidores remotos -es decir, que pueden estar en cualquier subdirectorio- entonces sí que debes usar File::Find

* Si sí sabes el directorio donde están, entonces te vale con una línea como la 94: haces un stat() dando la ruta del archivo, y listo

Si necesitas usar el find(), hay que entender cómo funciona: el primer argumento de la función debe ser, o un diccionario con todas las opciones de cómo se ha de realizar la búsqueda, o una referencia a un código ejecutable (una subrutina).

Se podría hacer algo de esto (código entre la 89 y la 96) (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. {
  2.     push @no_procesado, $texto;   # Insertamos los no procesados en el arreglo
  3.     find(\&busca,$ruta);
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y luego agregar, al final del programa esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub busca {
  2.     return if $_ ne $Archivos;
  3.     my $btime = (stat($File::Find::name))[9];
  4.     print "El archivo $Archivos se encuentra en la ruta $File::Find::name" if ($btime > $time);
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para que esto funciona, las variables $Archivos y $time deben ser globales o locales en el contexto mayor, que me parece recordar que sí que están.

¿Ves lo que se hace? A find() le pasamos una referencia a una subrutina que se ejecutará por cada fichero que find() encuentre en la $ruta. Dentro de ella, salimos inmediatamente si el fichero encontrado no es el que queremos. Si lo es, sacamos su stat() y lo imprimimos si cumple la condición de que su tiempo de modificación es superior a nuestra marca de tiempo.
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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