Rsync todos os diretórios que contêm um arquivo específico

Rsync todos os diretórios que contêm um arquivo específico

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 nde rsync no shellscript e execute-o ou do arquivo commande 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.

  1. Use o findcomando para encontrar os arquivos de seu interesse.
  2. Passe-os dirnamepara imprimir o nome do diretório no qual o arquivo está armazenado.
  3. Use uniqpara que o diretório seja listado apenas
  4. 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

informação relacionada