• Publicidad

Buscar un archivo en una ruta específica

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

Buscar un archivo en una ruta específica

Notapor animal collective » 2012-09-26 14:11 @632

Estimados,

Junto con saludarlos les comento el problema que presento:

Realicé un pequeño script en Windows que busca en una ruta si fueron creados unos archivos con cierto nombre; para esto utilizo el comando findstr.

El problema es que al ejecutar el comando en el script me arroja un error:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. C:\>script_log.pl 
  2. Unrecognized escape \I passed through at C:\script_log.pl line 5. 
  3. Unrecognized escape \A passed through at C:\script_log.pl line 5. 
  4. Unrecognized escape \p passed through at C:\script_log.pl line 5. 
  5. File Not Found 


Adjunto script:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\Perl\bin\perl.exe -w
  2.  
  3. use strict;
  4. my $valor;
  5. $valor=`dir /b D:\ILO\Log\AppServer\pro\Lodi | findstr /b java | findstr /e txt`;
  6. print $valor . "\n";
  7.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Si ejecuto la consulta
Sintáxis: [ Descargar ] [ Ocultar ]
  1. dir /b D:\ILO\Log\AppServer\pro\Lodi | findstr /b java | findstr /e txt 
directamente en la consola entrega la siguiente información:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
java.20120327.154419.21892.0004.tx
java.20120327.154421.21892.0005.tx
java.20120327.154421.21892.0006.tx
java.20120327.154447.21892.0010.tx
java.20120328.094250.6728.0004.txt
java.20120328.094253.6728.0005.txt
java.20120328.094301.6728.0006.txt
java.20120328.094325.6728.0010.txt
java.20120404.102803.15396.0001.tx
java.20120404.102803.15396.0006.tx
java.20120404.102803.15396.0009.tx
java.20120404.102803.15396.0010.tx
java.20120404.122406.23176.0003.tx
java.20120404.122432.23176.0004.tx
java.20120404.122509.23176.0009.tx
java.20120404.122509.23176.0010.tx
java.20120524.162631.5724.0002.txt
java.20120615.130726.5700.0002.txt
java.20120619.212536.5700.0002.txt
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El objetivo del script es detectar si se encontró el archivo y cuántas veces estaba en la ruta.

Desde ya agradezco su apoyo.

Saludos
animal collective
Perlero nuevo
Perlero nuevo
 
Mensajes: 39
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile

Publicidad

Re: Buscar un archivo en una ruta específica

Notapor explorer » 2012-09-26 15:26 @684

El comando findstr no busca por archivos con un cierto nombre, sino que busca si un texto está contenido dentro de un archivo o del texto que se le pase por la entrada estándar.

Cuando ejecutas el comando:

dir /b D:\ILO\Log\AppServer\pro\Lodi | findstr /b java | findstr /e txt

Estás generando un contenido (dir /b D:\ILO\Log\AppServer\pro\Lodi) y eso se lo pasas a dos comandos findstr, que filtrarán las líneas en donde aparezca el texto 'java' y luego de los que queden, los que tengan el texto 'txt'.

El error que te sale es que, en Perl, el carácter '\' dentro de una cadena de textos, suele indicar algo especial con respecto al carácter que le sigue.

Mejor ponlo de esta manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $valor = `dir /b D:/ILO/Log/AppServer/pro/Lodi | findstr /b java | findstr /e txt`;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


De todas maneras, lo puedes hacer todo desde Perl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:/Perl/bin/perl.exe
  2.  
  3. my $dir = 'D:/ILO/Log/AppServer/pro/Lodi';
  4.  
  5. my @archivos = glob("$dir/*.txt");      # buscamos todos los archivos .txt del directorio
  6. @archivos = grep { /java/ } @archivos;  # y de esos, nos quedamos con los que tengan la palabra 'java'
  7. for (@archivos) {                       # para todos los que quedan
  8.     print "$_\n";                       # los sacamos en pantalla
  9. }
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Buscar un archivo en una ruta específica

Notapor animal collective » 2012-10-03 10:08 @464

Estimado,

Funciona la búsqueda pero en la salida del script arroja lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. 03-10-2012 11:56:03 D:/ILO/Log/AppServer/pro/Lodi/java.20120327.154419.21892.0004.tx
  2. 03-10-2012 11:56:03 D:/ILO/Log/AppServer/pro/Lodi/java.20120327.154421.21892.0005.txt
  3. 03-10-2012 11:56:03 D:/ILO/Log/AppServer/pro/Lodi/java.20120327.154421.21892.0006.txt
  4. 03-10-2012 11:56:03 D:/ILO/Log/AppServer/pro/Lodi/java.20120327.154447.21892.0010.txt
  5. 03-10-2012 11:56:03 D:/ILO/Log/AppServer/pro/Lodi/java.20120328.094250.6728.0004.txt
  6. 03-10-2012 11:56:03 D:/ILO/Log/AppServer/pro/Lodi/java.20120328.094253.6728.0005.txt
  7. 03-10-2012 11:56:03 D:/ILO/Log/AppServer/pro/Lodi/java.20120328.094301.6728.0006.txt
  8. 03-10-2012 11:56:03 D:/ILO/Log/AppServer/pro/Lodi/java.20120328.094325.6728.0010.txt
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Realicé una modificación al script para que solo me deje la línea correspondiente a java.20120327.154421.21892.0005.txt

Agregué la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  my $valor = $test =~ /Lodi (\d+)/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero esto último no funciona.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:/Perl/bin/perl.exe
  2.  
  3. use POSIX 'strftime';
  4.  
  5. use strict;
  6. use warnings;
  7.  
  8. my $fecha = strftime "%d-%m-%Y %H:%M:%S", localtime;
  9.  
  10. my $dir = 'D:/ILO/Log/AppServer/pro/Lodi';
  11.      
  12. my @archivos = glob("$dir/*.txt");      # buscamos todos los archivos .txt del directorio
  13.    @archivos = grep { /java/ } @archivos;  # y de esos, nos quedamos con los que tengan la palabra 'java'
  14.  
  15.     for my $test(@archivos) {                       # para todos los que quedan
  16.        
  17.           my $valor = $test =~ /Lodi (\d+)/;
  18.        print $fecha, $valor. "\n";
  19.  
  20.                                
  21.     }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
animal collective
Perlero nuevo
Perlero nuevo
 
Mensajes: 39
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile

Re: Buscar un archivo en una ruta específica

Notapor explorer » 2012-10-03 10:32 @481

Me parece que no sé lo que quieres hacer...

¿Quieres quedarte solo con el nombre del archivo que coincida con la fecha de ahora?

Eso puede llegar a ser complicado si no sabes en qué último segundo se modificó el archivo.

La expresión regular tampoco es clara. Estás capturando un grupo de dígitos que siguen a "Lodi ", pero en ninguna parte de los nombres de los archivos existe "Lodi " ('Lodi' con un espacio en blanco).

Por favor, dinos exactamente qué quieres hacer.

En el primer mensaje dices que quieres saber cuántas veces aparece un determinado archivo, pero no sabemos de qué archivo estás hablando.

Si es de un archivo del que sabes perfectamente su nombre, te vale con usar el operador 'eq' en un if() para saber si está o no en la lista.
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: Buscar un archivo en una ruta específica

Notapor animal collective » 2012-10-03 10:55 @497

Quiero saber cuántas veces aparece el archivo 'java*.txt'

Necesito que la salida por pantalla sea:

Fecha actual java*.txt

No necesito que coincidan los archivos con la fecha.

Actualmente me muestra

fecha ruta de los archivos y el nombre de los archivos
animal collective
Perlero nuevo
Perlero nuevo
 
Mensajes: 39
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile

Re: Buscar un archivo en una ruta específica

Notapor explorer » 2012-10-03 13:41 @612

¡Ah, bueno! Si solo quieres saber cuántos archivos son, solo hay que contarlos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:/Perl/bin/perl.exe
  2. use strict;
  3. use warnings;
  4. use POSIX 'strftime';
  5.  
  6. my $fecha = strftime "%d-%m-%Y %H:%M:%S", localtime;
  7.  
  8. my $dir = 'D:/ILO/Log/AppServer/pro/Lodi';
  9.  
  10. my @archivos = glob("$dir/*.txt");       # buscamos todos los archivos .txt del directorio
  11.    @archivos = grep {/java/} @archivos;  # y de esos, nos quedamos con los que tengan la palabra 'java'
  12.  
  13. print "$fecha: ", scalar(@archivos), "\n";
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: 14480
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: No hay usuarios registrados visitando el Foro y 32 invitados