rsync sincronizando arquivos apenas sem criar pastas no destino

rsync sincronizando arquivos apenas sem criar pastas no destino

É possível com o rsync não criar diretórios no destino?

Imagine que tenho essa fonte:

a/
a/x.txt
b/
b/y.txt

E que eu tenho esse destino:

a/
a/z.txt

O resultado desejado de rsync source destination:

a/
a/x.txt
a/z.txt

É claro que minha situação real envolve estrutura de mil arquivos/pastas e não quero soluções que envolvam lista explícita de pastas sincronizadas, o que posso fazer.Estou procurando uma maneira limpa apenas de evitar a criação de qualquer pasta no destino.Excluindo ou filtrando... Isso pode até ser algo fora do rsync, como um hack com permissões se o rsync não puder fazer isso...


A título de informação, é muito fácil conseguir este tipo de situações, no meu caso tenho:

  • Um servidor com 2 discos, digamos A& B. E uma unidade local C.
  • Eu costumo usar rsyncpara sincronizar (e mesclar) remotamente Ae Bem local C.
  • Então, às vezes, eu só quero sincronizar alguns Carquivos em Ae B. (Apenas novos arquivos... não pastas inexistentes no destino)

Responder1

Experimente o seguinte:

rsync -av src:/dir/to/files/* /dest/dir

Se você tiver vários subdiretórios aninhados, precisará fazer algo assim primeiro:

find /dir/to/files -type d -print

Execute essa lista de diretórios por meio de um loop e chame rsync todas as vezes. Claro, supondo que você esteja fazendo isso em uma máquina remota, você precisará emitir o find via ssh e armazenar os resultados em um array e então executar o loop rsync.

Responder2

Implementei isso para rsync agora e enviei o patch para o upstream: https://lists.samba.org/archive/rsync/2015-November/030455.html

Responder3

talvez faça um rsync normal e, em uma segunda etapa, exclua todas as pastas recém-criadas ... parece perigoso.

Para aumentar a segurança desta operação você pode usar outro usuário que não o do sistema de destino:

rsync $src $specialuser@server:$destination

Excluindo as pastas criadas remotamente por esse usuário:

ssh $normalUser@destination "find $destination -type d -user $specialuser -exec rm -r {} \;"

E então defina as permissões de volta ao normal:

ssh $normalUser@destination "chown -R $defaultUser:$defaultGroup $destination"

caramba, isso parece sujo... isso precisa de algumas melhorias sérias: D

Responder4

Eu recomendo criar um arquivo include_file no seu destino usando um script para anexar /*a cada linha do resultado de:

encontre [target_dir] -type d >[target_dir]/include.file

Em seguida, você pode usar o rsync --include_file=[target_dir]/include.filepara especificar a inclusão apenas dos arquivos que correspondem a um padrão nesse arquivo - que deve ser uma lista completa de pastas no destino no ponto especificado.

Se você criar um script para fazer isso sempre, sua lista em include.file sempre será atual. Caso contrário, você pode decidir apenas atualizá-los (um em cada servidor para o qual deseja sincronizar novamente) ocasionalmente.

Se eu tiver tempo mais tarde, postarei um script python utilizável aqui, mas isso deve fornecer um bom caminho a seguir.

informação relacionada