У меня большая проблема с пониманием правил фильтрации 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, потому что я должен записать все правила в один файл. В этом дереве есть разные типы файлов, которые могут находиться на любом уровне дерева. Я бы хотел:
.php
, .txt
, .html
.jpg
файлы, которые не начинать с _
.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
...
Чтобы ответить на ваши вопросы:
Использование:
+ **/*.php
+ **/*.txt
+ **/*.html
Использование:
+ **/*.jpg
- **/_*.jpg
Понятия не имею, о чем ты.
Лучше всего создать файл, который вы будете использовать, с опцией: --files-from
используя команду find, например:
cd dirtobackup;find . |egrep '\.php$|\.txt$|\.html$|^[^_].*\.jpg$|^_dir.*\.jpg$' >/tmp/files_tobackup
rsync --files-from=/tmp/files_tobackup dirtubackup dst