É 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 localC
. - Eu costumo usar
rsync
para sincronizar (e mesclar) remotamenteA
eB
em localC
. - Então, às vezes, eu só quero sincronizar alguns
C
arquivos emA
eB
. (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.file
para 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.