¿Hay un comando como "watch" o "inotifywait" en el Mac?


Quiero ver una carpeta en mi Mac (Snow Leopard) y luego ejecutar un script (dándole el nombre de archivo de lo que se acaba de mover a una carpeta (como un parámetro... x.sh "filename")).

Tengo un guión escrito en bash (x.sh) que moverá algunos archivos y otras cosas en la entrada 1 1 Solo necesito que OSX me dé el nombre del archivo cuando los nuevos archivos/carpetas se mueven / crean en un directorio.

Cualquier comando?

Author: Kara, 2009-10-04

12 answers

Fswatch

Fswatch es un pequeño programa que utiliza la API de Mac OS X FSEvents para supervisar un directorio. Cuando se recibe un evento acerca de cualquier cambio en ese directorio, el comando shell es ejecutado por /bin/bash

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

Actualizar: fswatch ahora se puede usar en muchas plataformas, incluyendo BSD, Debian y Windows.

Sintaxis / Un Ejemplo Simple

La nueva forma que puede ver múltiples rutas - para versiones 1.x y superior :

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

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

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

Instalación con Homebrew

A partir del 9/12/13 se agregó de nuevo 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 compilador c en su sistema, es posible que necesite instalar Xcode o Xcode command line tools, ambas gratuitas. Sin embargo, si ese es el caso, probablemente debería simplemente revisar 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.
 358
Author: cwd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-27 08:12:55

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

Por ejemplo, el siguiente launchd config plist iniciará el programa /usr/bin/logger cuando se modifique la carpeta de 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 la lista de configuración, guárdela en la carpeta LaunchAgents en la carpeta de su biblioteca como "logger.plist".

Desde el shell puede utilizar el comando launchctl para activar el registrador.plist ejecutando:

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

La carpeta del escritorio está siendo monitoreada. Cada vez que se cambia, debería ver una salida en el sistema.registro (usar consola.app). Para desactivar el registrador.plist, ejecutar:

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

El archivo de configuración anterior utiliza la opción WatchPaths. Alternativamente, también puede utilizar el QueueDirectories opción. Vea la página man de launchd para más información.

 85
Author: sakra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-02 12:39:17

Facebook watchman , disponible a través de Homebrew, también se ve bien. También soporta filtrado:

Estas dos líneas establecen una vigilancia en un directorio fuente y luego establecen up a trigger named "buildme" that will run a tool named " minify-css" cada vez que se cambia un archivo CSS. A la herramienta se le pasará una lista de los nombres de archivo cambiados.

$ watchman watch ~/src

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

Observe que la ruta debe ser absoluta.

 20
Author: Jakub Holý,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-07 08:33:19

Es posible que desee echar un vistazo a (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 arquitectura kqueue permite el apilamiento jerárquico de eventos...

 19
Author: sschober,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-24 22:49:07

Watchdog es una API python multiplataforma para ver archivos / directorios, y tiene una herramienta incorporada de "trucos" que le permite activar acciones (incluidos comandos de shell) cuando ocurren eventos (incluido un nuevo archivo agregado, un archivo eliminado y un archivo cambiado).

 13
Author: gfxmonk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-11 13:00:22

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

 5
Author: Donny Winston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-18 09:13:30

Apple OSX Folder Actions le permiten automatizar tareas basadas en acciones realizadas en una carpeta.

 3
Author: Asaph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-09 00:10:36

Editar: fsw se ha fusionado en fswatch. En esta respuesta, toda referencia a fsw debe decir ahora fswatch.

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

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

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

    fsw file-0 ... file-n 
    
  • Arroja un detallado grabar 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 fsw la salida se pueda canalizar a otro proceso.

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

Obteniendo fsw:

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

    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 entrada de blog introductoria donde puedes encontrar un par de ejemplos sobre cómo funciona fsw.

 3
Author: Enrico M. Crisostomo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-05 20:21:56

He Aquí un one-liner utilizando sschober's herramienta.

$ while true; do kqwait doc/my_file.md; make; done
 3
Author: Joshua Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:36

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 fácil de analizar.

Es una mejora sobre el fswatch original porque envía la ruta real del archivo cambiado a través de STDOUT en lugar de requerir que proporcione un programa que se bifurca.

Ha sido una roca sólida como la base de una serie de scripts de bash de miedo que uso para automatizar cosas.

(esto es off-topic) inotifywait en Linux, por otro lado, requiere una gran cantidad de kludges en la parte superior de la misma y todavía no he descubierto una buena manera de gestionarlo, aunque creo que algo basado en node.js podría ser el ticket.

 2
Author: Steven Lu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-28 02:16:02

Tengo una idea para esto y el uso es bastante simple

watchfiles <cmd> <paths...>

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

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

Si quiero comprobar 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 watchfiles se ejecute silenciosamente (# se mostrará para que el usuario pueda ver que el programa es executing)
  • -qq hace watchfiles ejecutar completamente en silencio
  • -h muestra la ayuda y el uso

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

 1
Author: thiagoh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-05 07:45:25

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

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

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

watch -n3 your-command

 -1
Author: trusktr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-11 08:39:08