Назад | Перейти на главную страницу

rsync - исключить все каталоги, кроме нескольких

Кажется, есть много вопросов 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 ​​,, поэтому я использую имя хоста.

rsync -avin --progress ~ / MyDocuments / 'Inet Publishing' / --include = 'LandisTwo (2019)' --include = 'LandisTwo (2020) {backup}' --exclude = '* /' e6420: / home / landis / Media / 2TBackup / Backups / MyDocuments / | tee -a ~ / журналы / Backup-InetPublishing_2020.txt