24 votos

Monitorear una carpeta en busca de cambios, y ejecutar un comando cuando se detecte un cambio

¿Existe una forma sencilla de ejecutar automáticamente un comando (Terminal) cada vez que se cambia un archivo en una carpeta específica?

Esto debería ser posible a través de la línea de comandos, o una aplicación incorporada al sistema, sin aplicaciones de terceros.

¿Alguna idea?

18voto

eradman Puntos 123

entr(1) es una utilidad para ejecutar comandos cuando los archivos cambian. Lee una lista de archivos en STDIN y utiliza kqueue(2) para evitar las encuestas.

Ejemplo:

ls my_project/*.html | entr echo "file changed"

8voto

Guardar una lista de propiedades como esta como ~/Library/LaunchAgents/test.plist :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd>
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>test</string>
    <key>ProgramArguments</key>
    <array>
        <string>say</string>
        <string>yy</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>~/Desktop/</string>
    </array>
</dict>
</plist>

El agente puede ser cargado con launchctl load ~/Library/LaunchAgents/test.plist o cerrando la sesión y volviendo a entrar. Aplicar los cambios requiere descargar y cargar el plist.

La expansión de Tilde ( ~/ ) funciona en WatchPaths de forma predeterminada. EnableGlobbing añade expansión de comodín y tilde para ProgramArguments, pero no afecta ni a Program ni a WatchPaths.

Si un archivo vigilado se modifica dentro de los diez segundos de la última invocación, un mensaje como este se añade al system.log:

com.apple.launchd.peruser.501[146]: (test) Throttling respawn: Will start in 7 seconds

Una forma de deshacerse de los mensajes es añadir algo como sleep 10 hasta el final de scripts. Poner el Intervalo del acelerador a 10 no ayuda.

Los cambios en las subcarpetas de las carpetas vigiladas no se detectan.

Ver man launchd y man launchd.plist para más información.

3voto

Olaf Kock Puntos 18072

Podrías usar Acciones de carpeta, que te permite ejecutar (Automator) scripts siempre que cambie el contenido de una carpeta. Por lo que sé, Automator tiene una plantilla que te permite crear fácilmente una nueva acción de carpeta y adjuntarla a la carpeta deseada. Y al agregar una acción "Ejecutar Shell scripts", deberías obtener el efecto deseado.

1voto

timothymh Puntos 5183

Automator tiene un tipo de flujo de trabajo llamado "Acción de Carpeta" que se ejecuta automáticamente cuando se añade algo a una carpeta. Crea una, y luego usa la acción "Ejecutar Shell script".

-1voto

sudhin Puntos 16

Puede que quieras probar algo como esto:

touch /tmp/dirb.tmp
while true do 
  ls /thedirtocheck > /tmp/dira.tmp 
  diff /tmp/dira.tmp /tmp/dirb.tmp || echo "something changed" 
  cp /tmp/dira.tmp /tmp/dirb.tmp 
  sleep 100 
done

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X