Tenho copiado alguns arquivos e pastas criando um comando rsync manualmente usando uma lista de strings no shell.
Para estrutura de arquivos remotos como:
/home/foo/
media/
bigfile.bin
somedir/
a.txt
b.json
Eu escreveria:
rsync -Pavz my_remote:/home/foo/{media/bigfile.bin,somedir} .
A estrutura de arquivo local resultante é
./bigfile.bin
./somedir/
a.txt
b.json
A estrutura de diretórios é importante. bigfile.bin
não está localmente em um media/
diretório, mas somedir
foi copiado recursivamente. É isso que eu quero.
Agora, tenho um script para criar uma lista de arquivos a serem transferidos para que eu possa usar
rsync -Pavz --files-from=list.txt my_remote:/home/foo`
Onde list.txt
é
media/bigfile.bin
somedir/
Agora, a estrutura de arquivo local resultante é
./media/
bigfile.bin
./somedir/
a.txt
b.json
Agora tenho o media
diretório que não quero, acho que por causa do diretório base do comando como my_remote:/home/foo
. Existe alguma maneira de recuperar o comportamento anterior durante o uso --files-from
? Se eu ligar --no-R
, isso nivela tudo, mas na verdade eu ainda quero somedir/
. De forma mais geral, o comportamento desejado é "pegar a parte base do caminho especificado ( bigfile.bin
, somedir
) e copiá-la e seu conteúdo recursivamente, ignorando os diretórios pais ( media
) nos caminhos de destino".
Eu também poderia usar um script para construir o comando rsync com chaves para ser expandido pelo shell como estava fazendo inicialmente, mas potencialmente terei que lidar com uma dor de cabeça de escapes de caracteres em nomes de arquivos remotos que prefiro evitar usando --files-from
.
Acho que o que você está procurando é o seguinte (
rsync
versões => 2.6.7).Ao
list.txt
adicionar uma barra pontilhada./
no final do caminho que você não deseja incluir:Neste caso
./
fazrsync
ignorar o caminhomedia/
da linhamedia/./bigfile.bin
.Da página de manual
Acabei de testar e parece funcionar como eu entendo que você pretende.