Eu tenho o seguinte arquivo de texto
...
/a/b/c/f1
/a/b/c/f2
...
/a/b/c/d1
...
onde f1
e f2
são arquivos, while d1
é um diretório. Gostaria de copiar a hierarquia exata na minha pasta de destino ( /z
).
Com o bash, para cada linha lr
lida do arquivo de texto, meu script é executado (omiti as opções para simplificar)
rsync $lr/ /z/$lr
A pasta é copiada corretamente porque eu obtenho /z/a/b/c/d1
. Infelizmente, para os resultados dos arquivos
/z/a/b/c/f1/f1
/z/a/b/c/f2/f2
Como eu poderia resolver esse problema usando a mesma invocação mencionada acima rsync
para os arquivos e diretórios?
Não rsync os arquivos manualmente. Use a
--files-from=
opção de incluir seu arquivo de texto.Regras para diretórios:
/
/
ou opção--recursive
/-r
alternativamenteSe você usar a opção
-a
e quiser recursão, precisará adicionar-r
adicionalmente. Certifique-se de que os caminhos no arquivo sejam relativos ao diretório de origem (com ou sem/
).Um exemplo mínimo para sua entrada seria:
Se você precisar modificar/filtrar o arquivo de texto de antemão, você pode passá-lo de stdin para rsync, por exemplo
Vejamos o seu
rsync
comando. Você omitiu as opções - que são importantes - então presumi que você está usando-a
(--archive
) ou-rt
(--recursive --times
) e adicionarei-v
(--verbose
) também por conveniência.Você está lendo arquivos de origem deste arquivo de texto:
E você tem este modelo, onde cada linha do arquivo de texto é lida em
$lr
:Vamos aplicar um equivalente de linhas
f1
ed1
ao seu comando modelado e ver o que temos:Imediatamente podemos ver que com as informações que nos são mostradas, o arquivo
f1
não será copiado. Em vez disso, obtemos este erro,Se você vir
f1
no destino, ele deve ter sido copiado usando alguma outra solução, talvez uma tentativa anterior de usarrsync
.Da mesma forma,
d1
não será copiado para o destino, a menos que você já tenha criado o caminho do diretórioz/a/b/c
:Há algo errado nas informações da sua pergunta. Se ignorarmos o
rsync
comando e nos concentrarmos no conjunto de dados de origem, você pode usarrsync
para ler o conjunto de dados de origem diretamente:Isso pode parecer um pouco estranho porque geralmente
-a
inclui arquivos-r
. No entanto, como estamos usando--files-from
e você tem diretórios especificados no arquivo de dados de origem, precisamos especificar-r
explicitamente para informarrsync
a recursão nos diretórios de origem listados. (Sem isso, você só obterá arquivos nomeados copiados.)