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 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 dé el nombre del archivo cuando se mueven / crean nuevos archivos / carpetas en un directorio.
Cualquiera de esos comandos?
fswatch
utilidad presentada como una respuesta a continuación de hecho utiliza este método.Respuestas:
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 es ejecutado por
/bin/bash
Si está 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 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.xy superiores :
La forma más antigua para las versiones 0.x :
Instalación con Homebrew
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:Instalación sin Homebrew
Escriba estos comandos en
Terminal.app
Si no tiene un
c
compilador 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 echarle un vistazo a homebrew .Opciones adicionales para la
fswatch
versión 1.xfuente
make
arroja un error sobre no encontrar un archivo MAKE. Afortunadamente, fswatch ahora está en MacPorts, por lo quesudo port install fswatch
funciona, para aquellos de nosotros que usamos MacPorts en lugar de Homebrew.fswatch ./ | xargs -I{} cp {} ~/Dropbox/backup/latest/
fswatch .
monitoreará el directorio actual.fswatch -0 -v -o /path/to/watched/files | xargs -0 -n 1 -I {} [your command]
con-0
para NULLs. Este funciona para mí por menos compilaciónPuede usar launchd para ese propósito. Launchd puede configurarse para iniciar automáticamente un programa cuando se modifica una ruta de archivo.
Por ejemplo, la siguiente lista de configuración de launchd iniciará el programa
/usr/bin/logger
cuando se modifique la carpeta de escritorio de mi cuenta de usuario:Para activar el config plist guárdelo en la carpeta LaunchAgents en su carpeta Library como "logger.plist".
Desde el shell, puede usar el comando
launchctl
para activar logger.plist ejecutando:La carpeta del escritorio ahora está siendo monitoreada. Cada vez que se cambia, debería ver una salida en system.log (use Console.app). Para desactivar logger.plist, ejecute:
El archivo de configuración anterior usa la
WatchPaths
opción. Alternativamente, también puede usar laQueueDirectories
opción. Consulte la página de manual de launchd para obtener más información.fuente
/usr/bin/logger
con mi script Bash y eliminé la"<string>path modified</strong>"
entrada, no pude encontrar ninguna manera para que mi script bash supiera qué archivo en mi escritorio se modificó, solo que ocurrió el evento. Traté de mirar$0
,$1
y solo obtuve el nombre del script en sí, notando que se lo pasé.El vigilante de Facebook , disponible a través de Homebrew, también se ve bien. También es compatible con el filtrado:
Tenga en cuenta que la ruta debe ser absoluta.
fuente
Es posible que desee echar un vistazo (y tal vez expandir) 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 ...fuente
fswatch
(que también está bien, ya que es un envoltorio tan ligero que también podría modificarse para hacer lo correcto, estoy seguro) donde se dispararía al ejecutar cosas comogit status
(que en realidad se ejecuta cada vez que zsh el indicador se procesa en mi máquina ...) que realmente arruina este elaborado script que tengo al crear un bucle de retroalimentación interminable. kqwait, sin embargo, proporciona la información sobre el archivo modificado y no se activagit status
. Sin embargo, lo necesito para disparar en escritura.$ brew install kqwait && while true; do kqwait doc/my_file.md; make; done
watchdog es una API de Python multiplataforma para ver archivos / directorios, y tiene una herramienta integrada de "trucos" que le permite activar acciones (incluidos los comandos de shell) cuando se producen eventos (incluido el nuevo archivo agregado, el archivo eliminado y el archivo modificado).
fuente
Esto es solo para mencionar entr como una alternativa en OSX para ejecutar comandos arbitrarios cuando cambian los archivos. Lo encuentro simple y útil.
fuente
Aquí hay una línea usando
sschober
la herramienta de .fuente
$ brew install kqwait
Editar:
fsw
se ha fusionado confswatch
. En esta respuesta, cualquier referencia afsw
debería leer ahorafswatch
.Escribí un
fswatch
reemplazo en C ++ llamadofsw
que presenta varias mejoras:Es un proyecto de GNU Build System que se basa en cualquier plataforma compatible (OS X v.> = 10.6) con
Se pueden pasar múltiples rutas como argumentos diferentes:
Vuelca un registro detallado con toda la información del evento, como:
Su salida es fácil de analizar para que la
fsw
salida se pueda canalizar a otro proceso.-l, --latency
.-n, --numeric
.strftime
cadenas de formato con-t, --time-format
.-u, --utc-time
.Obteniendo fsw:
fsw
está alojado en GitHub y se puede obtener clonando su repositorio:Instalación de fsw:
fsw
se puede instalar con los siguientes comandos:Más información:
También escribí una publicación introductoria en el blog donde puedes encontrar un par de ejemplos sobre cómo
fsw
funciona.fuente
Las acciones de carpeta OSX de Apple le permiten automatizar tareas basadas en acciones tomadas en una carpeta.
fuente
Mi bifurcación de fswatch proporciona la funcionalidad de un
inotifywait -m
poco menos (sin esperar, ¡más! Tengo muchos más problemas en Linux coninotifywait
...) salida fácil de analizar.Es una mejora con respecto al original
fswatch
porque envía la ruta real del archivo modificado a través de STDOUT en lugar de requerirle que proporcione un programa que bifurca.Ha sido sólida como la base de una serie de scripts de bash que uso para automatizar cosas.
(esto está fuera de tema)
inotifywait
en Linux, por otro lado, requiere muchos errores y aún no he descubierto una buena forma de administrarlo, aunque creo que algo basado ennode.js
podría ser el ticket.fuente
brew install https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3/Library/Formula/fswatch.rb
Tengo un GIST para esto y el uso es bastante simple
Para ilustrar, el siguiente comando hará eco
Hello World
cada vez quefile1
Ofile2
cambie; y la comprobación de intervalo predeterminada es 1 segundoSi quiero verificar cada 5 segundos, puedo usar la
-t
bandera-v
habilita elverbose
modo que muestra información de depuración-q
hace que sewatchfiles
ejecute en silencio (#
se mostrará para que el usuario pueda ver que el programa se está ejecutando)-qq
hacewatchfiles
ejecutar completamente en silencio-h
muestra la ayuda y el usohttps://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
fuente
Terminé haciendo esto para macOS. Estoy seguro de que esto es terrible en muchos sentidos:
fuente
Si desea usar NodeJS, puede usar un paquete llamado chokidar (o chokidar-cli en realidad) para la observación y luego usar
rsync
(incluido con Mac):Comando Rsync:
$ rsync -avz --exclude 'some-file' --exclude 'some-dir' './' '/my/destination'
Chokidar cli (instalado globalmente a través de npm):
chokidar \"**/*\" -c \"your-rsync-command-above\"
fuente
Aquí hay una alternativa simple de una sola línea para usuarios que no tienen el
watch
comando que desean 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
fuente
your-command
hace E / S de disco, entonces esa es una lectura / escritura de disco garantizada cada 3 segundos, o 10.800 veces cada hora. Mediante el uso de eventos del sistema de archivos que le puede garantizar que E / S (y otras operaciones costosas) sólo ocurren cuando se cambia un archivo (que por lo general es sólo un par de veces por hora.)watch
cosas por períodos temporales para ver qué está haciendo algo. No uso mi técnica mencionada para aplicaciones de producción ni nada de eso. Por ejemplo, me gustaría ver el progreso dedd
, y mi técnica lo hace posible (reemplazandoyour-command
según corresponda para enviar la señal adecuadadd
).