Я работаю над кластером, для которого требуются как открытый ключ, так и пароль. У меня сложная файловая структура для организации работы над этим кластером, и я хотел бы иметь резервную копию на локальной машине только некоторых каталогов.
Я хотел бы, чтобы 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
Возможно, вам подойдет что-то подобное.
- Используйте
find
команду для поиска интересующих вас файлов. - Пропустите их,
dirname
чтобы напечатать имя каталога, в котором хранится файл. - Используйте
uniq
, чтобы в каталоге были указаны только те - Повторите результаты в rsync или объедините их так, чтобы rsync вызывался только один раз.
Простой сценарий:
for i in $(find . -name 'backup' -type f | xargs dirname | uniq); do
echo "here: $i"
# here goes rsync
done