¿Existe un comando como "watch" o "inotifywait" en Mac?

Resuelto Mint asked hace 15 años • 16 respuestas

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.

Mint avatar Oct 04 '09 13:10 Mint
Aceptado

fswatch

fswatches 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-toolspaquete 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 -ose agregará al final del xargscomando 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 ccompilador 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 fswatchla 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.
cwd avatar Dec 10 '2012 19:12 cwd

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/loggercuando 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 launchctlpara 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 WatchPathsopción. Alternativamente también puedes usar la QueueDirectoriesopción. Consulte la página de manual de lanzamiento para obtener más información.

sakra avatar Oct 04 '2009 09:10 sakra

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.

Jakub Holý avatar Apr 07 '2014 08:04 Jakub Holý

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...

sschober avatar Jan 24 '2012 22:01 sschober