Подтвердить что ты не робот

Rsync: --include-from vs. --exclude-из какой фактической разницы?

В документации упоминается, что это файлы, содержащие списки любых шаблонов для включения или шаблонов для исключения. Однако это подразумевает включение, все считается исключением, за исключением случаев, когда вещи соответствуют шаблонам. Например, файл include, содержащий:

/opt/**.cfg

Должен включать только любой файл с именем *.cfg, который существует где-нибудь в каталоге с именем opt где-нибудь в дереве. Таким образом, он будет соответствовать следующему:

/opt/etc/myfile.cfg
/some/dir/opt/myfile.cfg
/notopt/opt/some/other/dir/myfile.cfg

Поэтому я ожидал, что он неявно исключит что-нибудь еще. Но, похоже, это не так, поскольку я вижу это в детализации:

*deleting   etc/rc.d/init.d/somescript

Итак, какова сделка с --include-from и --exclude-from? Это просто псевдонимы для --filter-from?

4b9b3361

Ответ 1

rsync не работает. Предполагается, что любой файл с шаблоном имени файла, который не соответствует ни одному из включенных или исключающих шаблонов, считается включенным. Другими словами, подумайте о включении шаблона в качестве способа переопределения шаблона исключения.

Из docs:

Rsync создает упорядоченный список опций include/exclude, как указано в командной строке. Rsync поочередно проверяет каждый файл и имя каталога по каждому шаблону exclude/include. Выполняется первый шаблон соответствия. Если это шаблон исключения, то этот файл пропускается. Если это шаблон включения, то это имя файла не пропускается. Если не найдено совпадающего шаблона include/exclude, имя файла не пропускается.

(Акцент мой)

Итак, если вы хотите включить только определенные файлы, сначала нужно включить эти конкретные файлы, а затем исключить все остальные файлы:

--include="*/" --include="*.cfg" --exclude="*"

Несколько вещей, чтобы отметить здесь:

  • Шаблоны include должны появиться перед исключениями, потому что первый шаблон, который соответствует, является тем, который рассматривается. Если имя файла сначала совпадает с шаблоном исключения, оно исключается.

  • Вам нужно либо включить все подкаталоги отдельно, например, --include="/opt" --include="/opt/dir1" и т.д. для всех подкаталогов, либо использовать --include = "*/" для включения всех каталогов (а не файлов). Я пошел со вторым вариантом для краткости.

Это изворотливое и не очень интуитивное. Поэтому внимательно прочитайте docs (раздел "ИСКЛЮЧИТЬ ШАБЛОНЫ" в ссылке) и используйте параметр --dry-run или -n, чтобы убедиться, что это будет делать то, что вы думаете, что он должен делать.

Ответ 2

Если вам (как и мне) нелегко обернуть голову вокруг раздела FILTER RULES в man-страницах, но у вас есть базовое понимание find, вы можете использовать это вместо этого.

Предположим, что вы хотите синхронизировать каждое значение с определенной датой (ex 2016-02-01) в имени файла или в имени-каталога от /storage/data до rsync_test. Сделайте что-то вроде этого:

cd /storage/data
find . -name '*2016-02-01*' \
  | rsync --dry-run -arv --files-from=- /storage/data /tmp/rsync_test