Rsync: É possível transmitir arquivos src como links simbólicos e copiar o restante da estrutura dir

2

Eu quero copiar o diretório src como um modelo, ou seja, preservando a mesma estrutura. Os arquivos neste diretório de modelo devem apontar para o diretório src como links simbólicos. Não tenho certeza se o rsync pode fazer isso fora da caixa.

    
por user214977 08.02.2017 / 19:49

1 resposta

2

O rsync só pode fazer cópias ou (às vezes) links físicos, não links simbólicos. O programa cp do GNU coreutils pode fazer o que você quiser, pelo menos se você não precisar de opções rsync sofisticadas como filtragem baseada em nomes de arquivos. Basta usar o sinal -s , mais -a para recursão.

cp -as source target

Se você precisar de filtragem, você pode usar zsh 's zmv . A função zmv move os arquivos por padrão, mas você pode especificar outra operação com -S (criar links simbólicos, mas isso não é bom para seu caso de uso porque não copia diretórios) ou -p (especificar um arbitrário programa, aqui eu uso uma função que cria qualquer diretórios necessários e, em seguida, faz um symlink). Você pode especificar um padrão para restringir quais arquivos serão copiados; aqui eu uso ^*.dontcopy para omitir arquivos com a extensão .dontcopy e (m-7) para processar apenas arquivos modificados nos últimos 7 dias, mais ^/ para omitir diretórios da lista de arquivos a serem processados.

mkdir_ln () {
  mkdir -p $2:t &&
  ln -s $1:A $2
}
cd source
zmv -p mkdir_ln -Q '**/^*.dontcopy(m-7^/)' '../target/$f'

Acima, uso o modificador de histórico (:A) para transformar o primeiro argumento em um absoluto caminho. Se você quiser criar links simbólicos relativos, terá que construir o caminho de destino adequado, com o número correto de componentes ../ .

mkdir_ln () {
  mkdir -p $2:t &&
  ln -s ${1//[^/]##/..}/$1 $2
}
    
por 09.02.2017 / 01:35

Tags