¿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?
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.
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.
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.
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...
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).
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.
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.
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
.
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
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.
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 modoverbose
que muestra información de depuración -
-q
hace quewatchfiles
se ejecute silenciosamente (#
se mostrará para que el usuario pueda ver que el programa es executing) -
-qq
hacewatchfiles
ejecutar completamente en silencio -
-h
muestra la ayuda y el uso
Https://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
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
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