rsync uma lista de diretórios com caminho absoluto no arquivo de texto

7

Eu tenho um arquivo de texto contendo 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 está errado aqui?

    
por indiajoe 17.12.2014 / 14:47

3 respostas

4

Use o seguinte comando:

rsync -av --include-from=DirectoriesToCopy.txt --include /data/ --exclude='/data/*' --exclude='/*/' / /media/MyDestination/

Você precisa incluir / data / explicitamente, você também pode ter adicionado isso à lista no arquivo. Em seguida, exclua todos os outros diretórios (a ordem é importante para incluir / excluir).

Observe que o uso de -r foi redundante, pois está incluído em -a .

EDITAR: Você também pode obter o mesmo resultado com:

rsync -av --relative /data/Dir1 /data/Dir2 /media/MyDestination/

Não é o rsync que está forçando você a fazer coisas difíceis apenas para copiar alguns diretórios, ele apenas 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ê acabaria com /media/MyDestination/Dir1 e /media/MyDestination/Dir2 , com o --relative do todo o caminho de origem é copiado para o destino).

    
por 17.12.2014 / 16:56
5

I want to use rsync to copy all these directories [from a list] preserving its absolute path to another location

Não use as variações --include ou --filter , pois isso apenas confundirá as coisas. Em vez disso, use --files-from=_filename_ . (Se fizer isso, certifique-se de fazer lotes de testes.)

  1. Crie a lista de diretórios em um arquivo, um diretório / arquivo por linha.

  2. Use --files-from= do rsync com o arquivo acima.

  3. Use a opção --relative / -R para garantir que os nomes dos caminhos de origem sejam copiados no final do destino.

  4. Mesmo se você tiver a opção -a , inclua também -r . Na página do manual:

    In both cases, if the -r option was enabled, that dir's entire hierarchy would also be transferred (keep in mind that -r needs to be specified explicitly with --files-from, since it is not implied by -a).

Complete o comando:

rsync ${DEBUG:+-nv} -arR --files-from=<list_of_files.txt> <top-level-dir>  <target-dir>

(os arquivos em list_of_files.txt devem ser relativos ou encontrados em top-level-dir )

(se DEBUG estiver definido, o rsync simplesmente imprime o que pode ter sido copiado).

    
por 19.04.2015 / 10:49
2

O manual do rsync alerta sobre esse cenário (seção “Incluir / excluir regras padrão”):

this won't work:

+ /some/path/this-file-will-not-be-found
+ /file-is-included
- *

This fails because the parent directory "some" is excluded by the '*' rule, so rsync never visits any of the files in the "some" or "some/path" directories. One solution is to ask for all directories in the hierarchy to be included by using a single rule: "+ */" (put it somewhere before the "- *" rule), and perhaps use the --prune-empty-dirs option. Another solution is to add specific include rules for all the parent dirs that need to be visited. For instance, this set of rules works fine:

+ /some/
+ /some/path/
+ /some/path/this-file-is-found
+ /file-also-included
- *

No seu caso, acho que a abordagem mais simples seria pré-processar a lista de diretórios a serem incluídos para que, sempre que incluir /path/to/foo , você também inclua todos os diretórios pai ( /path/to , /path , / ), e também inclui subdiretórios dos diretórios originais ( /path/to/foo/*** ), e depois de tudo isso tem uma regra que exclui tudo o que não está listado anteriormente ( * ).

<DirectoriesToCopy.txt awk '
    {print "+ " $0 "/***"; while (sub(/\/+[^/]+\/*$/, "/")) print "+ " $0}
    END {print "- *"}
' >rsync-rules.txt
rsync -avr --include-from=rsync-rules.txt  /  /media/MyDestination/
    
por 18.12.2014 / 02:16