Se você tiver espaço, poderá manter uma cópia local da hierarquia remota. Quando seu inotify é acionado devido a uma mudança na sua hierarquia real, você pode usar rsync -a -i
entre a cópia real e local para atualizá-la e gerar uma lista de alterações reais. Aplique apenas esta lista para rsync atualizar o controle remoto da cópia local.
Para ajudar neste cenário, veja a seção de manual do rsync BATCH MODE . Em vez do -i
que você faz rsync -a --write-batch=foo
entre a cópia real e local, faça rsync -a --read-batch=foo
para o controle remoto para aplicar exatamente as mesmas alterações. (O arquivo foo é um arquivo binário contendo uma cópia de todas as alterações).
Aqui está um exemplo em / tmp usando as pastas a, b e c, onde a é o diretório real onde você edita os arquivos, b é uma cópia em cache local do controle remoto e c é o controle remoto. Nós criamos um e copiamos para bec para começar. Eu coloquei c em uma variável para que possa ser alterado mais tarde.
cd /tmp || exit
echo do: rm -fr a b c foo foo.sh
c=c
mkdir a
echo hi >a/f1
echo hi >a/f2
rsync -av a/ b
rsync -av a/ "$c"
Temos 3 diretórios idênticos. Nós editamos dir a.
echo bye >>a/f1
echo bye >>a/f3
rm -f a/f2
Nós rsync a para b, criamos um arquivo em lote foo:
rsync -av --delete --write-batch=/tmp/foo a/ b
Agora podemos executar novamente as alterações salvas em foo em c:
rsync -av --delete --read-batch=/tmp/foo "$c"
Agora existem novamente 3 diretórios idênticos. A vantagem é que o rsync fará apenas as atualizações gravadas no arquivo foo.
Eu tentei isso usando uma montagem gvfs ftp local para c, mas não funcionou ( c="$XDG_RUNTIME_DIR/gvfs/ftp:host=localhost,user=ftp/test/"
). A montagem gvfsd-fuse parece muito buggy e assume algumas vezes que um arquivo remoto deve ser um diretório, então o rsync nunca trabalhou com ele.