Puedes usar launchd
.
launchd
le permite administrar demonios y agentes de acuerdo con ciertas condiciones.
¿Qué son los demonios y los agentes?
Desde man launchd
:
Un "demonio" es, por definición, un servicio de todo el sistema del cual existe
Una instancia para todos los clientes. Un
"agente" es un servicio que se ejecuta por usuario. Los demonios no deben intentar mostrar la interfaz de usuario ni interactuar directamente con un usuario.
sesión de inicio de sesión. Cualquier trabajo que implique interactuar con un usuario debe realizarse a través de agentes.
De enlace :
Los demonios y agentes, conocidos colectivamente como programas de fondo, son
Programas que operan sin ninguna interfaz gráfica de usuario. Como un
desarrollador, puede utilizar programas en segundo plano para realizar acciones sin
interacción del usuario, y también para gestionar un estado compartido entre múltiples
otros programas.
La diferencia entre un agente y un demonio es que un agente puede
mostrar GUI si quiere, mientras que un demonio no puede. La diferencia
entre un agente y una aplicación regular es que un agente normalmente
no muestra GUI (o una GUI muy limitada).
El daemon / agent se describe en un archivo XML con la extensión plist. Una de las condiciones que se pueden monitorear es cambios en una carpeta . Esto será útil.
Está bien, ensuciémonos las manos:
Digamos que estas son las 2 carpetas donde usted y su amigo guardan sus archivos:
/tmp/folderstuart
/tmp/folderstuartsfriend
y esta es la carpeta común para la aplicación:
/tmp/folder
Queremos monitorear las dos rutas anteriores y sincronizar sus contenidos con /tmp/folder
.
Este es el plist que hace lo que necesitamos:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>notesfoldersync</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/rsync</string>
<string>-aE</string>
<string>--delete</string>
<string>--exclude='.*'</string>
<string>/tmp/folderstuart/</string>
<string>/tmp/folderstuartsfriend/</string>
<string>/tmp/folder</string>
</array>
<key>WatchPaths</key>
<array>
<string>/tmp/folderstuart</string>
<string>/tmp/folderstuartsfriend</string>
</array>
<key>ThrottleInterval</key>
<integer>10</integer>
</dict>
</plist>
El plist supervisa las dos carpetas con la clave WatchPaths
(consulte enlace ).
Sugiero el programa rsync
para sincronizar carpetas. La opción --delete
garantiza que los archivos eliminados en las carpetas monitoreadas también se eliminen en /tmp/folder
. Otras opciones son -aE
para copiar atributos HFS + estándar y extendidos, y --exclude='.*'
para omitir .localized
, .DS_Store
y otros archivos ocultos.
Agregué ThrottleInterval
en caso de que quiera establecer el intervalo mínimo para generar un trabajo. El valor predeterminado es 10 s, es decir, los trabajos no se generarán más de una vez cada 10 segundos.
Guarde el plist (vea man launchd
para una lista de posibles rutas) como:
/System/Library/LaunchDaemons/notesfoldersync.plist
Crear:
/tmp/folderstuart
/tmp/folderstuartsfriend
/tmp/folder
y cargue (es decir, habilite) el plist:
sudo launchctl load /System/Library/LaunchDaemons/notesfoldersync.plist
Ahora crea un archivo en /tmp/folderstuart
:
touch /tmp/folderstuart/file.txt
y observe cómo sucede la magia: file.txt
se creará en segundos en /tmp/folder
. Bórralo y desaparecerá de /tmp/folder
. También sincronizará los archivos creados o eliminados en /tmp/folderstuartsfriend
.
¡Observe que esta solución no maneja las colisiones de nombres! Si no puede asegurarse de que los archivos se nombren de manera diferente, sustituya rsync con un script que rsyncs y hace verificación de nombres para evitar la pérdida de datos.
Si copiar archivos no es una opción, sustituya rsync
con un script que cree enlaces físicos (si ambos archivos están en el mismo sistema de archivos, recomendaría enlaces físicos en lugar de enlaces simbólicos). Antes de cambiar el plist descargalo:
sudo launchctl unload /System/Library/LaunchDaemons/notesfoldersync.plist
Cuando hayas terminado, cárgalo de nuevo.