Eu tenho um arquivo de texto que contém uma lista de diretórios com seu caminho absoluto
$ cat DirectoriesToCopy.txt
/data/Dir1
/data/Dir2
Eu quero usar o rsync para copiar todos esses diretórios, preservando seu caminho absoluto para outro local.
Eu tentei o seguinte comando rsync, mas não funciona
rsync -avr --include-from=DirectoriesToCopy.txt --exclude='*/' --exclude='/*' / /media/MyDestination/
o que há de errado aqui?
/data/Dir1
e/data/Dir2
incluir o conteúdo para/media/MyDestination/Dir1
e/media/MyDestination/Dir2
? Ou você deseja incluir a/data
peça? Qual é o tamanho dessa lista? É muito grande para simplesmente listar essas entradas na linha de comando? De qualquer forma, suas--exclude
declarações impedem a recursão./media/MyDestination/data/Dir2/
. Eu adicionei o --exclude para impedir que outros diretórios e arquivos sejam copiados.rsync -av $(cat DirectotiesToCopy.txt) /media/MyDestination/
Respostas:
Use o seguinte comando:
Você precisa incluir / data / explicitamente, também pode ter adicionado isso à lista no arquivo. Exclua todos os outros diretórios (a ordem é importante com inclusões / exclusões).
Observe que seu uso
-r
foi redundante, pois está incluído no-a
.EDIT: Você também pode obter o mesmo resultado com:
Não é o rsync que está forçando você a fazer coisas difíceis apenas para copiar alguns diretórios, mas oferece várias maneiras de fazer a mesma coisa; em alguns casos, a maneira de incluir / excluir pode ser mais adequada, aqui eu faria a coisa - relativa acima (sem
--relative
você terminar com/media/MyDestination/Dir1
e/media/MyDestination/Dir2
, com--relative
todo o caminho de origem sendo copiado para o destino).fonte
rsync -av --relative $(cat DirectotiesToCopy.txt) /media/MyDestination/
--relative
é apenas outra opção.Não use
--include
ou--filter
variações, como que vai coisas simplesmente Confuse. Em vez disso, use--files-from=_filename_
. (Se fizer isso, faça muitos testes.)Crie a lista de diretórios em um arquivo, um diretório / arquivo por linha.
Use rsync's
--files-from=
com o arquivo acima.Use
--relative
/-R
option para garantir que os nomes dos caminhos de origem sejam copiados no final do destino.Mesmo se você tiver a
-a
opção, inclua também-r
. Na página do manual:Comando completo:
(os arquivos em list_of_files.txt devem ser relativos ou encontrados no diretório de nível superior )
(se DEBUG estiver definido, o rsync simplesmente imprime o que pode ter sido copiado.)
fonte
--include-from
também funcionará, mas o que eu disse sobre isso-r
é amplamente irrelevante.O manual do rsync alerta sobre esse cenário (seção “Incluir / excluir regras de padrão”):
No seu caso, acho que a abordagem mais simples seria a de pré-processar a lista de diretórios para incluir para que sempre que você incluir
/path/to/foo
, você também incluir todos os diretórios pai (/path/to
,/path
,/
), e também incluem subdiretórios dos diretórios originais (/path/to/foo/***
), e depois de tudo isso tem uma regra que exclui tudo que não foi listado anteriormente (*
).fonte