• Publicidad

Vigilar cambios en directorio

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

Vigilar cambios en directorio

Notapor aindergm » 2012-06-28 09:21 @431

¿Cómo se puede saber que ha habido cambios en un directorio? Es decir: saber si se ha escrito algún fichero o algún directorio, saber si se ha modificado algún fichero...

Y otra cosa, ¿cómo se elimina un directorio? Sé cómo se pueden borrar los ficheros:

'unlink($fichero);'

pero no consigo borrar un directorio.

¡Gracias por la ayuda!
aindergm
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-16 11:03 @502

Publicidad

Re: Vigilar cambios en directorio

Notapor explorer » 2012-06-28 11:30 @521

¿Cuándo quieres enterarte de que ha habido cambios en el directorio? ¿De forma inmediata o cada cierto tiempo?

Esta es la labor de un proceso que esté monitorizando los cambios. En Perl hay varias soluciones, con módulos específicos para esta tarea, pero se puede resolver de varias formas sencilla:

  • una de ellas es que cada X minutos, el cron (o Tareas programadas) lance un proceso que mire el listado actual del directorio y lo compare con el listado anterior, que ha sido guardado antes en un simple archivo de texto. Cuando termine la comparación, almacena el nuevo listado en ese archivo.
  • según el sistema operativo, hay facilidades para ser informados de esos cambios, en tiempo real. En Windows podemos usar módulos como Win32::FileSystem::Watcher o Win32::ChangeNotify, para recibir notificaciones. Ejemplo con Win32::ChangeNotify. En Linux, con la biblioteca del sistema INotify, se puede usar el módulo Linux::Inotify, para la misma tarea. Es más, desde hace un par de años existe la distribución File::ChangeNotify, que permite resolver el problema de forma independiente del sistema operativo que se use.
  • la forma clásica: mediante un testigo. En el directorio que queremos vigilar creamos un archivo con un nombre especial, por ejemplo, '.ultimo'. Luego, tenemos un proceso que se levanta cada X minutos (igual que antes), cuyo trabajo es obtener el listado del directorio. Y se queda con los archivos que tengan una fecha de modificación superior a la del archivo testigo. Los procesa, y termina actualizando el tiempo de modificación del testigo, para la siguiente vez.

Para borrar directorios se puede usar el clásico qx(rm -rf -- $directorio) (si estás en Linux, pero es peligrosísimo), o mucho mejor, usar la función remove_tree() del módulo File::Path.
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: Vigilar cambios en directorio

Notapor aindergm » 2012-06-29 04:50 @243

La cosa es que yo quiero que cuando haya cambios en un directorio (no cada X tiempo si no cuando haya un cambio) se ejecute un fichero Perl.

Es decir, si se ha creado un directorio ejecutar ese fichero Perl.

Gracias.
aindergm
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-16 11:03 @502

Re: Vigilar cambios en directorio

Notapor explorer » 2012-06-29 05:40 @278

Necesitas entonces tener un programa que esté permanente esperando ese suceso, como se indica en el segundo punto de mi correo anterior.

Si es para Windows, mira el ejemplo con Win32::ChangeNotify.
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: Vigilar cambios en directorio

Notapor aindergm » 2012-06-29 06:06 @296

¿Me podrías poner un ejemplo?
Es que el problema es que tiene que funcionar tanto en Windows como en Ubuntu...

¡Gracias por toda la ayuda que me estas ofreciendo!
aindergm
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-16 11:03 @502

Re: Vigilar cambios en directorio

Notapor explorer » 2012-06-29 06:45 @322

Iba a ponerte un ejemplo, pero realmente sería lo mismo que aparece en la sinopsis de File::ChangeNotify::Watcher. Míralo.

Lo que ya no sé es lo fácil que será de instalar.
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: Vigilar cambios en directorio

Notapor aindergm » 2012-06-29 08:47 @407

Pero luego ¿no tendría que poner in 'if' o algo para saber cuándo ha habido cambios y ejecutar el script que quiero?

Gracias
aindergm
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-16 11:03 @502

Re: Vigilar cambios en directorio

Notapor explorer » 2012-06-29 09:28 @436

En el programa monitor, con

while ( my @events = $watcher->wait_for_events() ) { ... }

se quedará esperando la llegada de eventos.

O también con

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $event ( $watcher->new_events() )
  2.     {
  3.         print $event->path(), ' - ', $event->type(), "\n";
  4.     }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


(Sacado de la documentación de File::ChangeNotify::Event)
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: Vigilar cambios en directorio

Notapor aindergm » 2012-07-03 05:39 @277

¿Para poder utilizar este módulo hay que instalar algo?
Si hace falta instalar algo ¿me podrías dar un link para poder hacerlo?

¡¡¡Gracias!!!
aindergm
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-05-16 11:03 @502

Re: Vigilar cambios en directorio

Notapor explorer » 2012-07-03 06:51 @327

En la página de la distribución tienes la lista de dependencias, y sí, hay que instalar unas cuantas cosas.

Pero siempre es mejor usar un comando o programa de gestión de distribución que ahorre todos esos pasos.

Si estás Windows, en la web de trouchelle.com puedes ver las combinaciones de versión Perl/versión de la distribución, para saber cuáles funcionan.

Por ejemplo, veo que con Perl v5.8 funciona hasta la última, la v0.20, mientras que con Perl v5.12 solo funciona hasta la v0.11; y con Perl v5.14, ninguna.
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

Siguiente

Volver a Básico

¿Quién está conectado?

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