FTP Sync via GVFS

0

Eu preciso editar arquivos PHP em um servidor FTP e, como meu editor local não é confiável ao salvar em uma montagem GVFS, deixo rsync fazer a sincronização:

#!/bin/bash
webroot=/run/user/1002/gvfs/ftp\:host\=ftp.server.com/
while true
do
    inotifywait -r -e create -e modify -e close_write -e moved_to ./ | \
    mawk '{ print $1 }' | \
    while read f
    do
        # currently, $f is always a directory (not just the changed file)
        echo "rsync $f..."
        mkdir -p $webroot"$f"
        rsync --exclude "*/" -rlpgoD "$f" $webroot"$f"
    done
done

Esse script sincroniza os diretórios cujos arquivos foram alterados, mas é muito lento. É por isso que procuro uma melhoria.

Como você escreveria esse roteiro? Idealmente, não sincroniza um diretório inteiro, mas apenas o arquivo alterado.

    
por ideaboxer 18.06.2016 / 23:36

1 resposta

0

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.

    
por 19.06.2016 / 10:42