Рейтинг:2

rsync все PDF-файлы, кроме определенных каталогов?

флаг cn

Я изо всех сил пытаюсь понять систему фильтров rsync, и это меня совершенно сбивает с толку.

У меня есть следующая «тестовая» структура каталогов, чтобы попытаться понять ее. Без параметров фильтра вот все мои файлы:

rsync -amv --dry-run/источник/цель

список файлов сборки ... готово
источник/
источник/1.pdf
источник/2.pdf
источник/exclude_rules.txt
источник/filter_rules.txt
источник/исключендир/
источник/excludedir/2.jpg
источник/excludedir/4.pdf
источник/подкаталог/
источник/подкаталог/1.jpg
источник/подкаталог/1.txt
источник/подкаталог/3.pdf
источник/подкаталог/подкаталог2/
источник/подкаталог/подкаталог2/6.jpg
источник/подкаталог/подкаталог2/6.pdf

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

Я использую файл с правилами фильтрации в нем со следующей командой:

rsync -amv --dry-run --filter='merge /filter_rules' /source /target

filter_rules выглядят как варианты следующего, но я не могу заставить их давать результаты, которые мне нужны:

-/ *исключать*/
+/ *.pdf
-/ *

Ближе всего я пришел к простому исключению:

-/ *исключать*/

Который дает:

список файлов сборки ... готово
источник/
источник/1.pdf
источник/2.pdf
источник/exclude_rules.txt
источник/filter_rules.txt
источник/подкаталог/
источник/подкаталог/1.jpg
источник/подкаталог/1.txt
источник/подкаталог/3.pdf
источник/подкаталог/подкаталог2/
источник/подкаталог/подкаталог2/6.jpg
источник/подкаталог/подкаталог2/6.pdf

Как мне отфильтровать остальные, чтобы просто получить *.pdf ?

Рейтинг:1
флаг cn

Для потомков я, наконец, заставил это работать, и вот инструкции, которые я хотел бы иметь:

  • rsync запускает процесс фильтрации с полным списком файлов
  • правила фильтрации обрабатываются ПО ПОРЯДКУ (мне потребовалось некоторое время, чтобы понять это)
  • У вас могут быть все правильные правила, но неправильный порядок, поэтому, если вы используете внешние исключающие или включаемые файлы, их может потребоваться переупорядочить с помощью файла фильтра, который позволяет вам смешивать и сопоставлять правила включения/исключения, или указан на самом cli
  • для каждого файла ПЕРВОЕ СООТВЕТСТВУЮЩЕЕ ПРАВИЛО ФИЛЬТРА помещает файл в одно из двух сегментов: включить или исключить.
  • Правила после первого совпадающего правила не применяются!
  • Каждое правило действует только на те файлы, которые «прошли» предыдущие правила, не соответствующие им.
  • Файлы, не соответствующие каким-либо правилам, ВКЛЮЧЕНЫ
  • Последнее правило является самым важным и неинтуитивным, и оно означает исключение всего, что не было специально включено ДО ЭТОГО МОМЕНТА.

Итак, вот что в итоге заработало:

-/ *исключать*/
+/ */
+/ *.pdf
-/ *

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

TomOnTime avatar
флаг pt
Реквизит для возвращения и публикации того, что вы узнали и как вы это узнали!
Рейтинг:0
флаг jp

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

https://stackoverflow.com/questions/35364075/using-rsync-filter-to-include-exclude-files

отредактировать - ОП прибил это в своем собственном ответе, но в соответствии с просьбой ... полезный бит из этой ссылки

Пояснения:

(только переформулировка руководства в конце, но, как вы сказали, руководство немного загадочно)

Правила считываются сверху вниз каждый раз, когда файл должен быть передан с помощью >rsync. Но в вашем случае /mnt/data/i-want-rsyncthisdirectory/ не резервируется, потому что вы исключаете /mnt, и это сокращает ваши правила включения. Таким образом, решение состоит в том, чтобы включить каждую папку и подпапку до папки, для которой вы хотите создать резервную копию, а затем исключить то, что вы не хотите создавать резервную копию, подпапку за подпапкой.

Обратите внимание на * в конце каждого исключения подпапки. Это предотвратит rsync для > резервного копирования файлов и папок, расположенных в этих подпапках, что, как я думаю, вам > нужно. Более простое решение: (редактировать 2)

Вы даже можете упростить это с помощью шаблона ***, который был добавлен в версии > 2.6.7:

  • /мнт/
  • /мнт/данные/
  • /mnt/data/я-хочу-rsyncэтоткаталог/***
  • /млн/**

Этот оператор позволяет вам использовать подстановочный знак ** для исключения и, следовательно, иметь только одну исключающую строку.

Я также обнаружил, что вы можете понять, какие правила фильтрации исключают/включают> каждый файл или папку, благодаря следующим аргументам rsync:

--подробно --подробно

В сочетании с аргументом --dry-run вы сможете отладить проблему >:)

флаг cn
Спасибо за ответ! Можете ли вы вытащить фрагменты, которые были наиболее полезными, на случай, если вопрос или ответы будут удалены в будущем?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.