Como rsync links simbólicos e seus referentes, mas preservando os links

1

Eu tenho a seguinte estrutura de arquivos em meu diretório src:

en/
en/a/
en/a/file1 -> ../../en/mp3/file1-longer-name-a
en/a/file2 -> ../../en/mp3/file2-longer-name-a
en/mp3/file1-longer-name-a
en/mp3/file1-longer-name-b
en/mp3/file2-longer-name-a
en/mp3/file3-longer-name-a

Estou interessado em copiar todos os arquivos em en / a / para o destino, preservando links simbólicos, e também incluir os arquivos de referência (que BTW estão todos dentro de en /), mas não outros arquivos em en / mp3 / se eles estiverem não é referido por nenhum link simbólico que estou transferindo.

Estou usando o seguinte comando, que faz a parte óbvia do trabalho:

rsync -avRz "${SRC}./en/a" "${DST}"

isto transfere os seguintes arquivos:

en/
en/a/
en/a/file1 -> ../../en/mp3/file1-longer-name-a
en/a/file2 -> ../../en/mp3/file2-longer-name-a

e espero que você me ajude a ajustar os argumentos rsync para que os seguintes arquivos também sejam transferidos:

en/mp3/file1-longer-name-a
en/mp3/file2-longer-name-a

Existe uma maneira de conseguir isso sem a necessidade de escrever um algoritmo para fazer um loop sobre os softlinks em en / a / e transferir os arquivos que eles apontam para um por um?

    
por Gavriel 06.05.2013 / 08:25

1 resposta

0

Você pode usar find em combinação com o parâmetro --files-from do rsync:

find "${SRC}./en/a" -type l -exec readlink {} ';'|sort|uniq|rsync -avRz --files-from=- "${SRC}" "${DST}"
  • find lista todos os links simbólicos na pasta en / e executa o readlink em cada um deles.
  • então, classificamos a lista e filtramos as duplicatas (com sort e uniq )
  • e o rsync obtém o parâmetro --files-from definido como - para ler os arquivos que devem ser sincronizados do stdin
por 06.05.2013 / 11:05

Tags