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?

fswatchutilidad 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/bashSi está en GNU / Linux, inotifywatch (parte del
inotify-toolspaquete en la mayoría de las distribuciones) proporciona una funcionalidad similar.Actualización:
fswatchahora 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.appSi no tiene un
ccompilador 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
fswatchversión 1.xfuente
makearroja un error sobre no encontrar un archivo MAKE. Afortunadamente, fswatch ahora está en MacPorts, por lo quesudo port install fswatchfunciona, 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-0para 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/loggercuando 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
launchctlpara 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
WatchPathsopción. Alternativamente, también puede usar laQueueDirectoriesopción. Consulte la página de manual de launchd para obtener más información.fuente
/usr/bin/loggercon 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,$1y 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; donewatchdog 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
sschoberla herramienta de .fuente
$ brew install kqwaitEditar:
fswse ha fusionado confswatch. En esta respuesta, cualquier referencia afswdebería leer ahorafswatch.Escribí un
fswatchreemplazo en C ++ llamadofswque 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
fswsalida se pueda canalizar a otro proceso.-l, --latency.-n, --numeric.strftimecadenas de formato con-t, --time-format.-u, --utc-time.Obteniendo fsw:
fswestá alojado en GitHub y se puede obtener clonando su repositorio:Instalación de fsw:
fswse 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
fswfunciona.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 -mpoco 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
fswatchporque 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)
inotifywaiten Linux, por otro lado, requiere muchos errores y aún no he descubierto una buena forma de administrarlo, aunque creo que algo basado ennode.jspodría ser el ticket.fuente
brew install https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3/Library/Formula/fswatch.rbTengo un GIST para esto y el uso es bastante simple
Para ilustrar, el siguiente comando hará eco
Hello Worldcada vez quefile1Ofile2cambie; y la comprobación de intervalo predeterminada es 1 segundoSi quiero verificar cada 5 segundos, puedo usar la
-tbandera-vhabilita elverbosemodo que muestra información de depuración-qhace que sewatchfilesejecute en silencio (#se mostrará para que el usuario pueda ver que el programa se está ejecutando)-qqhacewatchfilesejecutar completamente en silencio-hmuestra 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
watchcomando que desean ejecutar un comando cada 3 segundos:while :; do your-command; sleep 3; doneEs un bucle infinito que es básicamente lo mismo que hacer lo siguiente:
watch -n3 your-commandfuente
your-commandhace 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.)watchcosas 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-commandsegún corresponda para enviar la señal adecuadadd).