rsync, copiando o conteúdo do diretório de forma não recursiva

8

Estou tentando copiar o conteúdo de uma série de diretórios de forma não recursiva para outro sistema remoto.

/dirA/dir1/file
/dirA/dir2/file
/dirA/dir3/file

dir1, dir2 e dir3 contêm muitos diretórios que eu não quero copiar. Copie no host remoto para / dirB mantendo a mesma estrutura de diretório.

Eu tentei:

rsync /dirA/*/ host:/dirB/
rsync /dirA/   host:/dirB/

Mas eles não fazem o que eu quero.

Felipe Alvarez
fonte

Respostas:

20

O rsync permite especificar padrões que acionam a inclusão ou exclusão de arquivos e diretórios. Eu acho que você deseja usar algo como isto:

rsync -a -f '- /*/*/' /dirA/ host:/dirB/

Explicação:

  • -aaciona o modo de arquivamento que ativa a recursão e a preservação de "links simbólicos, dispositivos, atributos, permissões, propriedades etc.", de acordo com man rsync.
  • -fé uma abreviação de --filter=, que adiciona uma regra de filtragem de arquivos.
    • O padrão está entre aspas simples, para que o shell não expanda curingas; aspas duplas funcionariam igualmente bem nesse caso.
    • - significa que este é um padrão de exclusão.
    • Os principais /meios que o padrão deve iniciar em dirA/(o rsync "transfer-root").
    • A */*parte do padrão se refere a qualquer coisa dentro de um subdiretório.
    • O final /limita a exclusão a diretórios. Arquivos dentro de um subdiretório de dirA/não são afetados.

Portanto, no final, o rsync copia nada mais que um nível abaixo (e também não cria diretórios de segundo nível).

PleaseStand
fonte
2
Muito agradável! Consegui usar -f '- /*/'para restringir apenas os arquivos de nível superior. Eu também tive que especificar -f '- .*'para excluir arquivos de ponto, pois estava sincronizando um diretório inicial.
haridsv
5

A solução acima (por favor, PleaseStand) não funcionou para mim por algum motivo. Isso funcionou:

rsync -avc --no-r ./source/* ./destination/

Há também esta alternativa:

rsync -avc --exclude "/" ./source/ ./destination/

Andrei Pokrovsky
fonte
1

Um dos "recursos" do rsync é como os diretórios são analisados.

rsync /dirA/ host:/dirB/ e rsync /dirA host:/dirB teoricamente deve ser equivalente.

Como não querer incentivar recursividade, você quer evitar -r, -aque além de outras coisas implica -r.

Ainda não terminei a pesquisa, mas esta é a minha resposta inicial.

killermist
fonte