Monitoree una carpeta para ver los cambios y ejecute un command cuando se detecte un cambio

¿Existe una manera simple de ejecutar automáticamente un command (Terminal) cada vez que se cambia un file en una carpeta específica?

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

¿Algunas ideas?

  • plutil devuelve un error cuando se utiliza una key numérica de cadena
  • ¿Cómo puedo activar una notificación del Centro de notifications desde un AppleScript o script de shell?
  • Terminal "LoadModule" - command no encontrado
  • Comportamiento extraño en el terminal con perfil .bash personalizado
  • Comando de shell para contar páginas en un PDF (que no sea pdftk)?
  • ¿Lista los processs colgados en la Terminal?
  • Monitorear el número acumulado de bytes escritos por un process en la Terminal?
  • ¿Dig no devolviendo la sección de autoridad?
  • 6 Solutions collect form web for “Monitoree una carpeta para ver los cambios y ejecute un command cuando se detecte un cambio”

    entr (1) es una utilidad para ejecutar commands cuando los files cambian. Lee una list de files en STDIN y usa kqueue (2) para evitar el sondeo.

    Ejemplo:

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

    Guarde una list de properties como esta ~/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 cargarse con launchctl load ~/Library/LaunchAgents/test.plist o al cerrar session y volver a ingresar. La aplicación de cambios requiere download y cargar el plist.

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

    Si un file visto se modifica dentro de los diez segundos desde la última invocación, se agrega un post 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 posts es agregar algo como sleep 10 al final de los scripts. Establecer ThrottleInterval en 10 no ayuda.

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

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

    Puede usar las Acciones de carpeta, que le permiten ejecutar secuencias de commands (Automator) cada vez que cambia el contenido de una carpeta. Por lo que 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 get el efecto deseado.

    Las acciones de la carpeta están bien para activarlas cuando se agrega o modifica un file.

    Sin embargo, si su definición de cambio incluye eliminar un file, las acciones de la carpeta OSX no detectan si se ha eliminado un file.

    Para responder la pregunta:

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

    2. Familiarízate con correr rápido en la command-line: http://krakendev.io/blog/scripting-in-swift

    3. Usa 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 } 

    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 Script de Shell".

    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 
    Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).