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
}