Use o rsync para copiar vários diretórios para o mesmo local; manter a árvore

0

Estou usando um script de backup como o Time Machine, que cria um backup parcial para uma unidade externa usando links físicos:

#!/bin/bash

date='date "+%Y-%m-%dT%H-%M-%S"'
backup=/mnt/backup
targets="/ /data/seafile /boot /boot/efi"

mkdir -p $backup/logs 

rsync -a \
    --stats \
    --partial \
    -h \
    -H \
    -A \
    -X \
    -x \
    --log-file=$backup/logs/$date.log \
    --exclude='/media/**' --exclude='/mnt/**' --exclude='/proc/**' --exclude='/sys/**' --exclude='/tmp/**' --exclude='/run/**' --exclude='/dev/**' \
    $targets \
    --link-dest=$backup/latest \
    $backup/incomplete_$date \
    && mv $backup/incomplete_$date $backup/$date \
    && rm -f $backup/latest \
    && ln -s $backup/$date $backup/latest

Resultado:

/mnt/backup/
├── 2016-05-24T16-33-08
...
├── 2016-12-01T22-04-25
├── 2016-12-05T20-29-52
├── latest -> /mnt/backup/2016-12-05T20-29-52
├── logs
└── lost+found

Isso funcionou bem até agora, até eu começar a usar o LVM e dividir meus dados em diferentes pontos de montagem. Agora, o conteúdo desses backups é assim:

/mnt/backup/latest
├── bin
├── boot
├── data
...
├── efi
...
├── seafile
...

O que eu realmente pretendi é que o rsync copie cada item da lista / /data/seafile /boot /boot/efi para o local adequado na hierarquia, por exemplo, por exemplo. as pastas devem acabar assim:

/mnt/backup/latest
├── boot
│   ├── efi
...
├── data
│   └── seafile

O motivo pelo qual preciso especificar cada destino é a opção -x . Isso impede que o rsync cruze uma borda do sistema de arquivos durante a recursão. Uma solução "simples" seria:

  • remova o -x flag
  • especifique apenas / como destino

Mas isso me dá algumas desvantagens adicionais. Por exemplo, eu teria que excluir qualquer ponto de montagem indesejado com uma tag --exclude='/.../**' adicional. Por enquanto, não são muito, mas eu gostaria de ter uma opção de ativação em vez de uma opção de não participação.

    
por dersimn 06.12.2016 / 02:52

1 resposta

1

Você deve conseguir o efeito desejado com o sinalizador -R (ou --relative ). O reproduz o caminho completo da origem no destino, por exemplo, rsync -aR /a/b/c /dest criará um diretório /dest/a/b/c .

Seu --link-dest ainda deve funcionar, mas somente depois de ter feito uma primeira cópia nova, então você pode preferir mover os diretórios no último backup para corresponder à nova hierarquia ou não todos os links físicos serão criados. / p>     

por 06.12.2016 / 21:13