rsync subdiretórios específicos com correspondência de padrões

1

Estou tentando usar o rsync para copiar um conjunto específico de subdiretórios para fazer o backup deles. Minha estrutura de diretórios é algo assim:

/path/to/data/foo1
/path/to/data/foo2
/path/to/data/bar1
/path/to/data/bar2

Eu só quero copiar as pastas 'foo', ignorando as 'bar'.

Eu também quero ignorar todos os arquivos .zip dentro dessas pastas.

Eu tentei muitas combinações de argumentos no rsync, mas não consigo fazer exatamente o que eu quero.

Eu posso fazer a transferência como eu quero usando dois comandos:

rsync --dry-run -a --human-readable --stats --progress --exclude"*.zip" "/path/to/data/foo1" "/mnt/backup/drive/"
rsync --dry-run -a --human-readable --stats --progress --exclude"*.zip" "/path/to/data/foo2" "/mnt/backup/drive"

Formulário de leitura em outro lugar, espero que algo assim funcione

rsync --dry-run -a --human-readable --stats --progress --include="data/foo*" --exclude="*.zip" --exclude="*" "/path/to/data" "/mnt/backup/drive"

Mas isso também parece capturar as pastas 'bar'.

A ordenação dos argumentos --include e --exclude está me confundindo. Como é necessário especificar a pasta 'data' no argumento --include não é a funcionalidade que eu esperaria.

Qual é a bandeira óbvia que estou perdendo!

Obrigado pela sua contribuição.

Ben

    
por user1016815 28.04.2018 / 22:12

2 respostas

1

Funcionará para você executar o rsync desta forma:

rsync --dry-run -av --human-readable --stats --progress --exclude="*.zip" /path/to/data/foo* /path/to/copy/to/

talvez você queira reduzir o comando desta maneira:

rsync  -avhn --stats --progress --exclude="*.zip" /path/to/data/foo* /path/to/copy/to/

citando man rsync

-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)

-v, --verbose increase verbosity

-h, --human-readable output numbers in a human-readable format

-n, --dry-run perform a trial run with no changes made

quando estiver pronto, execute o comando sem -n

também é possível salvar um arquivo de log com este argumento:

--log-file=

para que o comando rsync acima seja:

rsync  -avhn --stats --progress --exclude="*.zip" --log-file=logfile.log /path/to/data/foo* /path/to/copy/to/

o arquivo de log será escrito no mesmo diretório onde você executa o comando, se você precisar salvá-lo em outro local, você deve usar um caminho absoluto. por exemplo:

--log-file=/path/to/logfile

    
por 28.04.2018 / 22:54
0

Você já tem uma resposta adequada e tudo bem. Eu queria abordar a outra parte da sua pergunta que pergunta por que a funcionalidade --include não faz o que você espera.

Primeiro, vamos ver como os filtros --include e --exclude operam.

  • aaa será aplicado a qualquer arquivo ou diretório denominado aaa
  • /aaa será aplicado a qualquer arquivo ou diretório denominado aaa na parte superior do caminho de origem
  • aaa/ será aplicado a qualquer diretório chamado aaa

Você pode combiná-los, portanto, um caminho de bbb/ccc/ indica qualquer diretório ccc que é filho de um diretório bbb em qualquer lugar na árvore de origem , mas /bbb/ccc/ é um diretório ccc dentro de um diretório bbb que está amarrado ao topo da árvore de código .

As operações de inclusão e exclusão são processadas da esquerda para a direita (a primeira operação é mais importante que a segunda e a segunda é mais importante que a terceira).

Agora vamos ver seu exemplo específico:

rsync -ah --include="data/foo*" --exclude="*.zip" --exclude="*" "/path/to/data" "/mnt/backup/drive"

As regras de filtragem dizem, por ordem:

  1. Inclua todos os arquivos ou diretórios cujo nome comece com foo e que estejam em um diretório chamado data em algum lugar abaixo do caminho de origem .
  2. Exclua todos os arquivos *.zip (ou diretórios).
  3. Exclua tudo o que já não mencionamos.

A primeira inclusão corresponderia a /path/to/data/data/foo1 , mas não corresponderia a /path/to/data/foo1 . Eu suspeito que este seja o principal mal-entendido.

Você pode combinar seus diretórios /foo* com uma solução muito semelhante:

rsync -ah --include="/foo*/" --exclude="*.zip" --exclude="*" "/path/to/data/" "/mnt/backup/drive"

Mas, na verdade, se eu estivesse escrevendo isso, provavelmente incluiria os diretórios /foo* na especificação do caminho de origem (observe o foo* não foi identificado para que o shell possa obter o caractere curinga) e só se preocupe em excluir o CEP indesejado arquivos:

rsync -ah --exclude="*.zip" /path/to/data/foo*/ /mnt/backup/drive
    
por 29.04.2018 / 14:41

Tags