Rsync всех каталогов, содержащих определенный файл

Rsync всех каталогов, содержащих определенный файл

Я работаю над кластером, для которого требуются как открытый ключ, так и пароль. У меня сложная файловая структура для организации работы над этим кластером, и я хотел бы иметь резервную копию на локальной машине только некоторых каталогов.

Я хотел бы, чтобы rsync получал только те каталоги, в которых есть файл с именем «backup». Пример:

data/sub1/sub1_1/backup < back up this directory
data/sub1/sub1_2/ < don't back up

Из-за этой проблемы с паролем я хотел бы избежать любого скрипта, который вызывает ssh несколько раз. Есть ли какой-нибудь продвинутый фильтр, способный сделать это с помощью rsync?

решение1

Если количество каталогов для резервного копирования не слишком велико, вы можете поместить их в командную строку с помощью скрипта оболочки bash. Следующий скрипт оболочки является демонстрационным.

Структура каталога

$ tree data
data
└── sub1
    ├── sub1_1
    │   ├── a
    │   ├── b
    │   └── backup
    ├── sub1_2
    │   └── c
    └── sub1_3
        ├── backup
        └── d

4 directories, 6 files

Скрипт оболочкиrsyncer

#!/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

Пробный прогон

$ ./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)

Обратите внимание, что sub1/sub1_2и файлсне перечислены.

Резервное копирование

Удалите опцию nиз rsync в скрипте оболочки и запустите его или из файла commandи запустите его,

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

Обратите внимание, что sub1/sub1_2и файлсне перечислены.

решение2

Возможно, вам подойдет что-то подобное.

  1. Используйте findкоманду для поиска интересующих вас файлов.
  2. Пропустите их, dirnameчтобы напечатать имя каталога, в котором хранится файл.
  3. Используйте uniq, чтобы в каталоге были указаны только те
  4. Повторите результаты в rsync или объедините их так, чтобы rsync вызывался только один раз.

Простой сценарий:

for i in $(find . -name 'backup' -type f | xargs dirname | uniq); do
  echo "here: $i"
  # here goes rsync
done

Связанный контент