Estou trabalhando em um cluster que requer chave pública e senha, tenho uma estrutura de arquivos complexa para organizar meu trabalho neste cluster e gostaria de ter um backup em minha máquina local apenas de alguns diretórios.
Gostaria que o rsync obtivesse apenas diretórios que possuam um arquivo chamado "backup". Exemplo:
data/sub1/sub1_1/backup < back up this directory
data/sub1/sub1_2/ < don't back up
Por causa dessa senha, eu gostaria de evitar qualquer script que chame ssh várias vezes. Existe algum filtro avançado capaz de fazer isso com o rsync?
Responder1
Se o número de diretórios para backup não for muito grande, você pode colocá-los na linha de comando usando um shellscript bash. O shellscript a seguir é uma demonstração.
Estrutura de diretório
$ tree data
data
└── sub1
├── sub1_1
│ ├── a
│ ├── b
│ └── backup
├── sub1_2
│ └── c
└── sub1_3
├── backup
└── d
4 directories, 6 files
Shellscriptrsyncer
#!/bin/bash
echo -n 'rsync -avn ' > command
find . -name 'backup' -type f | sed -e 's%/backup%%' -e 's%.*%"&"%' | tr '\n' ' ' >> command
echo ' target/' >> command
bash command
Funcionamento a seco
$ ./rsyncer
sending incremental file list
created directory target
sub1_1/
sub1_1/a
sub1_1/b
sub1_1/backup
sub1_3/
sub1_3/backup
sub1_3/d
sent 199 bytes received 64 bytes 526.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
Observe que sub1/sub1_2e o arquivocnão estão listados.
Cópia de segurança
Remova a opção n
de rsync no shellscript e execute-o ou do arquivo command
e execute-o,
sed 's/-avn/-av/' command > buper
$ bash buper
sending incremental file list
created directory target
sub1_1/
sub1_1/a
sub1_1/b
sub1_1/backup
sub1_3/
sub1_3/backup
sub1_3/d
sent 383 bytes received 148 bytes 1,062.00 bytes/sec
total size is 0 speedup is 0.00
$ tree target
target
├── sub1_1
│ ├── a
│ ├── b
│ └── backup
└── sub1_3
├── backup
└── d
2 directories, 5 files
Observe que sub1/sub1_2e o arquivocnão estão listados.
Responder2
Talvez você possa usar algo parecido.
- Use o
find
comando para encontrar os arquivos de seu interesse. - Passe-os
dirname
para imprimir o nome do diretório no qual o arquivo está armazenado. - Use
uniq
para que o diretório seja listado apenas - Itere o resultado no rsync ou junte-os para que o rsync seja invocado apenas uma vez.
Roteiro simples:
for i in $(find . -name 'backup' -type f | xargs dirname | uniq); do
echo "here: $i"
# here goes rsync
done