Supervise los cambios en una carpeta y ejecute un comando cuando se detecte un cambio

10

¿Hay una manera simple 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 integrada en el sistema, sin aplicaciones de terceros.

¿Algunas ideas?

Louis B.
fuente

Respuestas:

6

Guarde 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 se puede cargar launchctl load ~/Library/LaunchAgents/test.plisto cerrar sesión y volver a iniciarla. La aplicación de cambios requiere descargar y cargar la lista.

Tilde expansion ( ~/) funciona en WatchPaths por defecto. EnableGlobbing agrega comodines y expansión de tilde para ProgramArguments, pero no afecta a Program o WatchPaths.

Si un archivo observado se modifica dentro de los diez segundos desde la última invocación, se agrega un mensaje como este a system.log:

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

Una forma de deshacerse de los mensajes es agregar algo parecido sleep 10al final de los scripts. Establecer ThrottleInterval en 10 no ayuda.

No se detectan cambios en las subcarpetas de las carpetas observadas.

Ver man launchdy man launchd.plistpara más información.

Lri
fuente
5

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

Ejemplo:

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

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

xeophin
fuente
55
Gracias, pero parece que las "Acciones de carpeta" solo se activan cuando se agrega un archivo a la carpeta, no cuando se marca un archivo existente.
Louis B.
3

Las acciones de carpeta están bien para activarse cuando se agrega o modifica un archivo.

Sin embargo, si su definición de cambio incluye la eliminación de un archivo, las acciones de la Carpeta OSX no detectan si un archivo ha sido eliminado.

Para responder la pregunta:

  1. Descargue las dependencias de FileWatcher desde aquí: https://github.com/eonist/swift-utils

  2. Familiarícese con la ejecución rápida en la línea de comando: http://krakendev.io/blog/scripting-in-swift

  3. Use este código para mirar una carpeta.

Código:

var fileWatcher = FileWatcher(["~/Desktop/test/".tildePath])/*<---the fileWatcher instance must be scoped to your class*/

fileWatcher!.event = { event in
    Swift.print(self?.someVariable)//Outputs: a variable in your current class
    Swift.print(event.description)//Outputs: a description of the file change
}
eonista
fuente
1

Automator tiene un tipo de flujo de trabajo llamado "Acción de carpeta" que se ejecuta automáticamente cuando se agrega algo a una carpeta. Cree uno, luego use la acción "Ejecutar Shell Script".

Timothy Mueller-Harder
fuente
44
Gracias, pero parece que las "Acciones de carpeta" solo se activan cuando se agrega un archivo a la carpeta, no cuando se marca un archivo existente.
Louis B.
Ah, vale. Lo siento.
Timothy Mueller-Harder
0

Es posible que desee 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
Holger von Ameln
fuente
También necesita al menos ls -ldetectar los cambios en el archivo.
nohillside
correcto ... lo perdí
Holger von Ameln