Кажется, есть много вопросов SF и SO по этому поводу, но ни один из них не соответствует моим требованиям.
source_dir/
some_dir/
another_dir/
some_file.php
some_other_file.txt
include_this_dir/
include_that_dir/
yet_another_dir/
Итак, я хочу выполнить синхронизацию двух из этих каталогов, исключив остальные. Важно исключить Все но эти два каталога, потому что могут быть другие файлы, которые позже будут добавлены в source_dir и их нужно будет исключить без явного перечисления.
Я попытался:
rsync -av --dry-run --delete --exclude="source_dir/*" (or just "*") --include-from="include.txt" source_dir dest_dir
И мой include.txt имел
include_this_dir/
include_that_dir/
а также я попытался добавить
source_dir/
Никакой радости. Вообще ничего не включается.
Простой фильтр должен помочь. Чтобы основываться на предыдущем ответе на надлежащем примере - явно укажите родительский (ие), а также все (**) подпапки и файлы. Затем исключите все остальное. Вот filter.txt
:
+ /include_this_dir/
+ /include_this_dir/**
+ /include_that_dir/
+ /include_that_dir/**
- /**
В командной строке:
rsync -av --dry-run --filter="merge filter.txt" source_dir/ dest_dir/
Это приведет к:
sending incremental file list
created directory dest_dir
./
include_that_dir/
include_that_dir/somefile.txt
include_that_dir/subdir/
include_this_dir/
sent 202 bytes received 65 bytes 534.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
Цитировать из rsync
раздел руководства FILTER RULES
:
[..] выполняется действие с первым совпадающим шаблоном: если это исключающий шаблон, то этот файл пропускается; если это шаблон включения, то это имя файла не пропускается; если соответствующий шаблон не найден, имя файла не пропускается.
Таким образом, лучше всего будет прочитать правила фильтрации из файла и отсортировать их соответствующим образом. Пример:
CW+ source_dir/include_this_dir/
CW+ source_dir/include_that_dir/
CW- source_dir/
Вы можете указать файл правил фильтрации с помощью --filter=
параметр.
Новая командная строка, которая создает --included каталоги и копирует их содержимое, каталог и / или файлы, но ТОЛЬКО 2 DIRS DEEP. Зачем?
rsync -avid --progress ~/MyDocuments/'Inet Publishing'/ --recursive --include='LandisTwo (2019)' --include='LandisTwo (2020) {backup}' --include='*.*' --exclude='**/' e6420:/home/landis/Media/2TBackup/Backups/MyDocuments/"Inet\ Publishing"/ | tee -a ~/logs/Backup-InetPublishing_2020.txt
это работает для меня, от рабочей станции к серверу, резервное копирование (rysnc) моего личного сайта на другой сервер в дополнение ко всему каталогу со всеми сайтами, когда rysnc'ing parent ../ Inet \ Publishing ('n' in -avin это «пробный запуск», удалить.).
--Exclude * / - это все остальные каталоги в 'Inet Publishing /' и, кажется, должен быть After --include per man rsync process order (если до --include, то все --excluded и никакие дальнейшие токены не обрабатываются , по крайней мере, так я это читаю и на практике пробегаюсь с этим.).
На самом деле это одна строка из одного из моих сценариев, которые я запускаю с помощью cron. * очевидно, что целевой хост может быть IP, у меня есть хосты, определенные в / etc / hosts, и есть пары ключей ssh ,, поэтому я использую имя хоста.