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.

  • ¿Cuándo usaré la key de recuperación FileVault 2?
  • Conéctese al dispositivo Bluetooth a través del terminal
  • Mac Mini (finales de 2009) - ¿Versión de OSX recomendada para ello?
  • Cómo cambiar las luces indicadoras del dock Color en Mac OS X solo para una aplicación que estoy usando ¿lo sabías?
  • Cómo download la versión anterior de Mac OS X que tengo y las lists de la App Store, pero App Store se niega a usar la nueva Mac
  • Buscando la aplicación de reloj despertador de cronómetro similar a uno en iphone en OSX para macbookpro
  • ¿Algunas ideas?

  • Forma correcta de liberar el espacio de Time Machine
  • ¿Cómo puedo boost la sensibilidad del ratón Magic Mouse?
  • ¿iCloud Drive ocupa espacio en la unidad local?
  • No hay video de Mac Mini, SÓLO una vez que OS X ha cargado
  • Actualización a OS X Mavericks (10.9) a través del uso compartido de pantalla
  • Cuando cierro mi MacBook, mi pantalla Ultrafine 4K permanece encendida (quiero que todo duerma)
  • 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).