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

правила файла фильтра rsync для подпути

У меня большая проблема с пониманием правил фильтрации rsync для подпути. У меня есть это дерево каталогов:

|-- index.php
|-- other-file-php.php
|-- filesource.php
|   |-- album1
|   |   |-- firstphoto.jpg
|   |   |-- second.jpg
|   |   |-- index.php
|   |   `-- thumbs
|   |       |-- _map.txt
|   |       |-- _title_ciao.jpg.txt
|   |       |-- _120_second.jpg
|   |       |-- _dir_album1.jpg
|   |       `-- _300_second.jpg
|   |-- altre
|   |   |-- img_1172.jpg
|   |   |-- album2
|   |   |   |-- index.php
|   |   |   `-- thumbs
|   |   |       |-- _title_img_1172.jpg.txt
|   |   |       |-- _dir_album2.jpg
|   |   |       `-- _guestbook.html

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

  1. иметь полную резервную копию структуры каталогов
  2. резервное копирование всех файлов типа .php, .txt, .html
  3. резервное копирование .jpg файлы, которые не начинать с _
  4. резервное копирование .jpg файлы, начинающиеся с _dir

Поместите следующие строки в filter.txt:

+ */
+ *.php
+ *.txt
+ *.html
+ **/_dir*.jpg
- **/_*.jpg
+ *.jpg
- *

Тогда беги rsync как это:

rsync -a --include-from=filter.txt /path/to/source/ /path/to/dest

Объяснение filter.txt:

Прежде всего, обратите внимание, что порядок правил фильтрации очень важен, поскольку rsync оценивает их по порядку и применяет первое правило, которое соответствует.

По умолчанию, rsync включает все файлы, которые явно не исключены, поэтому последнее правило в filter.txt состоит в том, чтобы исключить все, что явно не было включено в предыдущие правила. Первое правило включает в себя все каталоги (на что указывает конечный /), который позаботится о вашем состоянии №1. Правила 2–4 обрабатывают файлы php, txt и html соответственно, а правила 5–7 разрешают все файлы jpg, которые начинаются с _dir, или иначе не начинайте с _.

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

Последнее замечание: если вы не можете (по какой-то причине) использовать --include-from, то вы сможете указать правила фильтрации как серию -f параметры в командной строке.

РЕДАКТИРОВАТЬ

Использовать filter.txt в rsnapshot, вы можете указать это в rsnapshot.conf через include_file параметр, как показано ниже:

include_file /path/to/filter.txt

РЕДАКТИРОВАТЬ # 2

Если вам нужно использовать разные наборы фильтров для каждой резервной копии, вы можете использовать разные include_file для каждого backup линия в вашем rsnapshot.conf, например:

...
backup /path/to/src1/ dest1/ include_file=/path/to/src1_filter.txt
backup /path/to/src2/ dest2/ include_file=/path/to/src2_filter.txt
...

Чтобы ответить на ваши вопросы:

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

    + **/*.php
    + **/*.txt
    + **/*.html
    
  3. Использование:

    + **/*.jpg
    - **/_*.jpg
    
  4. Понятия не имею, о чем ты.

Лучше всего создать файл, который вы будете использовать, с опцией: --files-from используя команду find, например:

cd dirtobackup;find . |egrep '\.php$|\.txt$|\.html$|^[^_].*\.jpg$|^_dir.*\.jpg$' >/tmp/files_tobackup
rsync --files-from=/tmp/files_tobackup dirtubackup dst