rsync sincronizando arquivos apenas sem criar pastas no destino

4

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

Imagine que eu tenha essa fonte:

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

E que eu tenho este 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 mil arquivos / estrutura de pastas e não quero soluções envolvendo uma lista explícita de pastas sincronizadas, o que posso fazer. Eu estou procurando uma maneira limpa apenas para evitar qualquer criação de pasta no destino. Por excluir ou filtrar ... Isso pode até ser algo fora do rsync, como um hack com permissões se o rsync não puder fazer isso ...

Para informações, é muito fácil conseguir esse tipo de situação, no meu caso eu tenho:

  • Um servidor com dois discos, digamos A & %código%. E uma unidade local B .
  • Normalmente, uso C para sincronizar (e mesclar) o rsync & A no local B .
  • Então, às vezes, só quero sincronizar alguns arquivos C em C e A . (Apenas novos arquivos ... não pastas inexistentes no destino)
por Vincent 29.07.2011 / 11:15

5 respostas

2

Tente 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 a cada vez. É claro, supondo que você esteja fazendo isso em uma máquina remota, você precisará emitir a localização via ssh e armazenar os resultados em uma matriz e, em seguida, executar o loop rsync.

    
por 09.07.2012 / 16:01
0

talvez faça um rsync normal e, em um segundo passo, exclua todas as pastas recém-criadas ... pareça perigoso.

Para aumentar a segurança dessa operação, você pode usar outro usuário diferente daquele no 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, em seguida, defina as permissões de volta ao normal:

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

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

    
por 28.07.2011 / 14:43
0

Você pode gerar um conjunto de regras de filtro na máquina de destino da seguinte maneira:

find /destdir/ -type d -printf 'show /%P/\nshow /%P/*\n'; echo 'hide *'

Você pode arrastar isso para os argumentos da linha de comando ou gravar o resultado em um arquivo e incluí-lo usando a regra de filtro merge . Você provavelmente poderia fazer algo assim:

rsync srcdir/ target:/destdir/ --filter='merge '<(ssh target \
    find /destdir/ -type d -printf 'show /%P/\nshow /%P/*\n'; echo 'hide *')

A ideia é fornecer uma lista de coisas que você deseja poder sincronizar (ou seja, mostrar para o rsync). Esta lista inclui diretórios e arquivos existentes diretamente . Qualquer coisa fora desses diretórios será ocultada da transferência, ou seja, não criada no destino.

Qualquer diretório ou arquivo existente no destino, mas não na origem, pode ser excluído se você também especificar --delete . Se não for isso que você deseja, convém usar include e exclude em vez de show e hide .

Tudo isso é não testado , por isso não serei responsabilizado por qualquer perda de dados que isso cause a você.

    
por 09.07.2012 / 17:57
0

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

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

Em seguida, você pode usar --include_file=[target_dir]/include.file de rsync para especificar incluindo apenas os 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 toda vez, sua lista em include.file será sempre atual. Caso contrário, você pode decidir apenas atualizá-los (um em cada servidor para o qual você deseja rsync).

Se eu tiver tempo depois, postarei um script Python utilizável aqui, mas isso deve dar um bom caminho adiante.

    
por 22.07.2015 / 22:53
0

Eu implementei isso para o rsync agora e enviei o patch para o desenvolvedor: link

    
por 28.11.2015 / 23:05

Tags