¿Hay algún comando como “mirar” o “inotifywait” en la Mac?

Quiero ver una carpeta en mi Mac (Snow Leopard) y luego ejecutar una secuencia de comandos (dándole el nombre de archivo de lo que acaba de pasar a una carpeta (como un parámetro … x.sh “nombre de archivo”)).

Tengo un script escrito en bash (x.sh) que moverá algunos archivos y otras cosas en la entrada $ 1. Solo necesito que OSX me proporcione el nombre del archivo cuando los nuevos archivos / carpetas se muevan / creen en un directorio.

¿Algún comando así?

fswatch

fswatch es un pequeño progtwig que utiliza la API FSEvents de Mac OS X para supervisar un directorio. Cuando se recibe un evento sobre cualquier cambio en ese directorio, /bin/bash ejecuta el comando de shell especificado

Si está en GNU / Linux, inotifywatch (parte del paquete inotify-tools en la mayoría de las distribuciones) ofrece una funcionalidad similar.

Actualización: fswatch ahora se puede usar en muchas plataformas, incluidas BSD, Debian y Windows.

Sintaxis / Un ejemplo simple

La nueva forma de ver múltiples rutas: para las versiones 1.x y posteriores :

 fswatch -o ~/path/to/watch | xargs -n1 ~/script/to/run/when/files/change.sh 

La forma más antigua para las versiones 0.x :

 fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh 

Instalación con Homebrew

A partir del 12/09/13, se volvió a agregar a homebrew – ¡yay! Por lo tanto, actualice su lista de fórmulas ( brew update ) y luego todo lo que necesita hacer es:

 brew install fswatch 

Instalación sin Homebrew

Escriba estos comandos en Terminal.app

 cd /tmp git clone https://github.com/alandipert/fswatch cd fswatch/ make cp fswatch /usr/local/bin/fswatch 

Si no tiene un comstackdor de c en su sistema, es posible que necesite instalar las herramientas de línea de comandos Xcode o Xcode, ambas gratuitas. Sin embargo, si ese es el caso, probablemente deberías echar un vistazo a homebrew .

Opciones adicionales para fswatch versión 1.x

 Usage: fswatch [OPTION] ... path ... Options: -0, --print0 Use the ASCII NUL character (0) as line separator. -1, --one-event Exit fsw after the first set of events is received. -e, --exclude=REGEX Exclude paths matching REGEX. -E, --extended Use exended regular expressions. -f, --format-time Print the event time using the specified format. -h, --help Show this message. -i, --insensitive Use case insensitive regular expressions. -k, --kqueue Use the kqueue monitor. -l, --latency=DOUBLE Set the latency. -L, --follow-links Follow symbolic links. -n, --numeric Print a numeric event mask. -o, --one-per-batch Print a single message with the number of change events. in the current batch. -p, --poll Use the poll monitor. -r, --recursive Recurse subdirectories. -t, --timestamp Print the event timestamp. -u, --utc-time Print the event time as UTC time. -v, --verbose Print verbose output. -x, --event-flags Print the event flags. See the man page for more information. 

Puedes usar launchd para ese propósito. Launchd se puede configurar para iniciar automáticamente un progtwig cuando se modifica una ruta de archivo.

Por ejemplo, la siguiente configuración de launchd lanzará el progtwig /usr/bin/logger cuando se modifique la carpeta del escritorio de mi cuenta de usuario:

     Label logger ProgramArguments  /usr/bin/logger path modified  WatchPaths  /Users/sakra/Desktop/    

Para activar la configuración, guárdela en la carpeta LaunchAgents en su carpeta Library como “logger.plist”.

Desde el shell, puede usar el comando launchctl para activar logger.plist ejecutando:

 $ launchctl load ~/Library/LaunchAgents/logger.plist 

La carpeta del escritorio ahora está siendo monitoreada. Cada vez que se modifique debería ver una salida en system.log (use Console.app). Para desactivar Logger.plist, ejecuta:

 $ launchctl unload ~/Library/LaunchAgents/logger.plist 

El archivo de configuración anterior usa la opción WatchPaths . Alternativamente, también puede usar la opción QueueDirectories . Consulte la página de manual de launchd para obtener más información.

El vigilante de Facebook, disponible a través de Homebrew, también se ve bien. Es compatible también con el filtrado:

Estas dos líneas establecen un reloj en un directorio fuente y luego configuran un disparador llamado “buildme” que ejecutará una herramienta llamada “minify-css” cada vez que se cambie un archivo CSS. La herramienta recibirá una lista de los nombres de archivo modificados.

$ watchman watch ~/src

$ watchman -- trigger ~/src buildme '*.css' -- minify-css

Tenga en cuenta que la ruta debe ser absoluta.

Es posible que desee echar un vistazo (y tal vez ampliar) mi pequeña herramienta kqwait . Actualmente solo se sienta y espera un evento de escritura en un solo archivo, pero la architecture kqueue permite el astackmiento de eventos jerárquico …

watchdog es una API de python multiplataforma para ver archivos / directorios, y tiene una herramienta integrada de “trucos” que le permite disparar acciones (incluyendo comandos de shell) cuando ocurren eventos (incluyendo nuevo archivo agregado, archivo eliminado y archivo modificado).

Esto es solo para mencionar entr como alternativa en OSX para ejecutar comandos arbitrarios cuando los archivos cambian. Lo encuentro simple y útil.

Las acciones de la carpeta Apple OSX le permiten automatizar las tareas según las acciones realizadas en una carpeta.

Editar: fsw se ha fusionado en fswatch . En esta respuesta, cualquier referencia a fsw ahora debería leer fswatch .

Escribí un reemplazo fswatch en C ++ llamado fsw que presenta varias mejoras:

  • Es un proyecto del Sistema de comstackción de GNU que se basa en cualquier plataforma compatible (OS X v.> = 10.6) con

     ./configure && make && sudo make install 
  • Se pueden pasar múltiples rutas como diferentes argumentos:

     fsw file-0 ... file-n 
  • Vacia un registro detallado con toda la información del evento, como:

     Sat Feb 15 00:53:45 2014 - /path/to/file:inodeMetaMod modified isFile 
  • Su salida es fácil de analizar para que la salida de fsw se pueda canalizar a otro proceso.

  • Latencia se puede personalizar con -l, --latency .
  • Se pueden escribir indicadores de eventos numéricos en lugar de textuales con -n, --numeric .
  • El formato de tiempo se puede personalizar utilizando strftime formato strftime con -t, --time-format .
  • La hora puede ser la hora local de la máquina (por defecto) o la hora UTC con -u, --utc-time .

Obteniendo fsw:

fsw está alojado en GitHub y se puede obtener clonando su repository:

  git clone https://github.com/emcrisostomo/fsw 

Instalando fsw:

fsw se puede instalar usando los siguientes comandos:

  ./configure && make && sudo make install 

Más información:

También escribí una publicación introductoria en el blog donde puedes encontrar un par de ejemplos sobre cómo funciona fsw .

Mi fork de fswatch proporciona la funcionalidad de inotifywait -m con un poco menos (¡no espere, más! Tengo muchos más problemas en Linux con inotifywait …) salida inotifywait .

Es una mejora con respecto al fswatch original porque envía la ruta real del archivo modificado a través de STDOUT en lugar de requerirle que proporcione un progtwig que se bifurca.

Ha sido sólido como la base de una serie de secuencias de comandos bash que uso para automatizar cosas.

(esto está fuera de tema) inotifywait en Linux, por otro lado, requiere una gran cantidad de kludges y aún no he descubierto una buena forma de administrarlo, aunque creo que algo basado en node.js podría ser el boleto.

Aquí hay un trazador de líneas usando la herramienta de sschober .

 $ while true; do kqwait doc/my_file.md; make; done 

Tengo un GIST para esto y el uso es bastante simple

 watchfiles   

Para ilustrarlo, el siguiente comando hará eco en Hello World cada vez que cambie el file2 O el file2 ; y la verificación de intervalo predeterminada es de 1 segundo

 watchfiles 'echo Hello World' /path/to/file1 /path/to/file2 

Si quiero verificar cada 5 segundos, puedo usar la bandera -t

 watchfiles -t 'echo Hello World' /path/to/file1 /path/to/file2 
  • -v habilita el modo verbose que muestra información de depuración
  • -q hace que los watchfiles ejecuten silenciosamente (se mostrará # para que el usuario pueda ver que el progtwig se está ejecutando)
  • -qq hace que los watchfiles ejecuten completamente en silencio
  • -h muestra la ayuda y el uso

https://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55

Aquí hay una alternativa simple de una sola línea para los usuarios que no tienen el comando de watch y quieren ejecutar un comando cada 3 segundos:

while :; do your-command; sleep 3; done

Es un ciclo infinito que es básicamente lo mismo que hacer lo siguiente:

watch -n3 your-command

    Intereting Posts