Você poderia usar launchd
.
launchd
permite gerenciar daemons e agentes de acordo com determinadas condições.
O que são daemons e agentes?
De man launchd
:
Um "daemon" é, por definição, um serviço em todo o sistema, do qual existe uma instância para todos os clientes. Um "agente" é um serviço que é executado por usuário. Os daemons não devem tentar exibir a interface do usuário ou interagir diretamente com a sessão de logon do usuário. Todo e qualquer trabalho que envolva interação com um usuário deve ser realizado por meio de agentes.
Em http://developer.apple.com/library/mac/#technotes/tn2083/_index.html :
Daemons e agentes, conhecidos coletivamente como programas em segundo plano, são programas que operam sem nenhuma interface gráfica do usuário. Como desenvolvedor, você pode usar programas em segundo plano para executar ações sem a interação do usuário e também para gerenciar um estado compartilhado entre vários outros programas.
A diferença entre um agente e um daemon é que um agente pode exibir a GUI, se desejar, enquanto um daemon não pode. A diferença entre um agente e um aplicativo regular é que um agente normalmente não exibe GUI (ou uma GUI muito limitada).
O daemon / agente é descrito em um arquivo XML com extensão plist. Uma das condições que podem ser monitoradas são as alterações em uma pasta . Isto virá a calhar.
OK, vamos sujar as mãos:
Digamos que estas são as 2 pastas em que você e seu amigo mantêm seus arquivos:
/tmp/folderstuart
/tmp/folderstuartsfriend
e esta é a pasta comum para o aplicativo:
/tmp/folder
Queremos monitorar os dois caminhos acima e sincronizar seu conteúdo com /tmp/folder
.
Esta é a lista que faz o que precisamos:
<?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>
O plist monitora as duas pastas com a chave WatchPaths
(consulte http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html#//apple_ref/doc/uid/10000172i-SW7 -SW8 ).
Eu sugiro o programa rsync
para sincronizar pastas. A opção --delete
garante que os arquivos excluídos nas pastas monitoradas também sejam excluídos /tmp/folder
. Outras opções são -aE
para copiar padrão e estendido atributos HFS +, e --exclude='.*'
saltar .localized
, .DS_Store
e outros arquivos ocultos.
Eu adicionei ThrottleInterval
caso você queira definir o intervalo mínimo que um trabalho pode gerar. O valor padrão é 10 s, ou seja, os trabalhos não serão gerados mais de uma vez a cada 10 segundos.
Salve o plist (veja man launchd
uma lista de caminhos possíveis) como:
/System/Library/LaunchDaemons/notesfoldersync.plist
Crio:
/tmp/folderstuart
/tmp/folderstuartsfriend
/tmp/folder
e carregue (ou seja, habilite) o plist:
sudo launchctl load /System/Library/LaunchDaemons/notesfoldersync.plist
Agora crie um arquivo em /tmp/folderstuart
:
touch /tmp/folderstuart/file.txt
e veja a mágica acontecer: file.txt
será criada em segundos em /tmp/folder
. Exclua-o e ele desaparecerá /tmp/folder
. Ele também sincronizará os arquivos criados ou excluídos /tmp/folderstuartsfriend
.
Observe que esta solução não lida com colisões de nomes! Se você não puder garantir que os arquivos sejam nomeados de maneira diferente, substitua o rsync por um script que rsyncs e faça a verificação do nome do arquivo para evitar a perda de dados.
Se a cópia de arquivos não for uma opção, substitua rsync
por um script que crie links físicos (se os dois arquivos estiverem no mesmo sistema de arquivos, eu recomendaria links físicos em vez de links simbólicos). Antes de mudar o plist, descarregue-o:
sudo launchctl unload /System/Library/LaunchDaemons/notesfoldersync.plist
Quando terminar, carregue-o novamente.