Supervise una carpeta para detectar cambios y ejecute un comando cuando se detecte un cambio

9

¿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 integrada del sistema, no aplicaciones de terceros.

¿Alguna idea?

    
pregunta Louis B. 17.02.2012 - 10:01

6 respuestas

6

Guarda 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 con launchctl load ~/Library/LaunchAgents/test.plist o al cerrar sesión y volver a iniciarla. La aplicación de los cambios requiere la descarga y la carga.

La expansión de tilde ( ~/ ) funciona en WatchPaths de forma predeterminada. EnableGlobbing agrega expansión de comodines y tilde para ProgramArguments, pero no afecta a Program o WatchPaths.

Si un archivo visto se modifica dentro de los diez segundos posteriores a 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 como sleep 10 al final de los scripts. Establecer ThrottleInterval en 10 no ayuda.

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

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

    
respondido por el user495470 17.02.2012 - 15:02
5

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

Ejemplo:

ls my_project/*.html | entr echo "file changed"
    
respondido por el eradman 04.07.2013 - 06:50
3

Podría usar Folder Actions, que le permite ejecutar scripts (Automator) siempre que cambien los contenidos de una carpeta. Que yo sepa, 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 shell script", deberías obtener el efecto deseado.

    
respondido por el xeophin 17.02.2012 - 12:54
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 se ha eliminado un archivo.

Para responder a la pregunta:

  1. Descargue las dependencias de FileWatcher desde aquí: enlace

  2. Familiarícese con correr swift en la línea de comando: enlace

  3. Use este código para ver 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
}
    
respondido por el eonist 09.04.2016 - 12:33
1

Automator tiene un tipo de flujo de trabajo denominado "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".

    
respondido por el Timothy Mueller-Harder 17.02.2012 - 12:52
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
    
respondido por el Holger von Ameln 17.02.2012 - 12:48

Lea otras preguntas en las etiquetas