¿Existe un comando como "watch" o "inotifywait" en Mac?
Quiero ver una carpeta en mi Mac y luego ejecutar un script bash, pasándole el nombre de cualquier archivo/carpeta que se acaba de mover o crear en el directorio observado.
fswatch
fswatch
es un pequeño programa que utiliza la API FSEvents de Mac OS X para monitorear un directorio. Cuando se recibe un evento sobre cualquier cambio en ese directorio, el comando de shell especificado se ejecuta mediante/bin/bash
Si estás en GNU/Linux,
inotifywatch
(parte del
inotify-tools
paquete en la mayoría de las distribuciones) proporciona una funcionalidad similar.
Actualización: fswatch
ahora se puede utilizar en muchas plataformas, incluidas BSD, Debian y Windows.
Sintaxis / Un ejemplo simple
La nueva forma que puede observar múltiples rutas, para versiones 1.x y superiores :
fswatch -o ~/path/to/watch | xargs -n1 -I{} ~/script/to/run/when/files/change.sh
Nota: El número generado por
-o
se agregará al final delxargs
comando si no es por el-I{}
. Si elige utilizar ese número, colóquelo{}
en cualquier lugar de su comando.
La forma anterior para las versiones 0.x :
fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh
Instalación con cerveza casera
A partir del 12/09/13 se volvió a agregar a homebrew , ¡sí! Entonces, 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 enTerminal.app
cd /tmp
git clone https://github.com/alandipert/fswatch
cd fswatch/
make
cp fswatch /usr/local/bin/fswatch
Si no tiene un c
compilador en su sistema, es posible que necesite instalar Xcode o las herramientas de línea de comandos de Xcode, ambas gratuitas. Sin embargo, si ese es el caso, probablemente deberías consultar homebrew .
Opciones adicionales para fswatch
la 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 programa cuando se modifica la ruta de un archivo.
Por ejemplo, el siguiente plist de configuración de lanzamiento iniciará el programa /usr/bin/logger
cuando se modifique la carpeta del escritorio de mi cuenta de usuario:
<?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>logger</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/logger</string>
<string>path modified</string>
</array>
<key>WatchPaths</key>
<array>
<string>/Users/sakra/Desktop/</string>
</array>
</dict>
</plist>
Para activar el plist de configuración, guárdelo en la carpeta LaunchAgents en su carpeta Biblioteca como "logger.plist".
Desde el shell puedes usar el comando launchctl
para activar logger.plist ejecutando:
$ launchctl cargar ~/Library/LaunchAgents/logger.plist
La carpeta del escritorio ahora está siendo monitoreada. Cada vez que se cambia, debería ver un resultado en system.log (use Console.app). Para desactivar logger.plist, ejecute:
$ launchctl unload ~/Library/LaunchAgents/logger.plist
El archivo de configuración anterior utiliza la WatchPaths
opción. Alternativamente también puedes usar la
QueueDirectories
opción. Consulte la página de manual de lanzamiento para obtener más información.
El vigilante de Facebook , disponible a través de Homebrew, también tiene buena pinta. También admite filtrado:
Estas dos líneas establecen una vigilancia en un directorio fuente y luego configuran un activador 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 archivos modificados.
$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css
Observe que el camino debe ser absoluto.
Quizás quieras echarle un vistazo (y tal vez ampliar) mi pequeña herramienta kqwait
. Actualmente simplemente se queda sentado esperando un evento de escritura en un solo archivo, pero la arquitectura kqueue permite el apilamiento jerárquico de eventos...