Кажется, я не могу найти никаких документов о том, как анализируется синтаксис файла исключения.
т.е. поддерживает ли он подстановочные знаки? регулярное выражение? как он различает файлы и каталоги? нужны ли префиксы пути? откуда (cwd / или root?)?
Некоторые примеры:
.qiv-trash (directory that could be anywhere on the filesystem)
.DS_Store
lost+found/
._*
desktop.ini
Thumbs.db (file that could be anywhere on the filesystem)
.Trash-* (the asterisk could be any number, is it needed?)
.tmp$ (file ending in .tmp)
~$ (file ending in a tilde)
~/.cache/ (cache directory in user home dir, using tilde syntax)
/full/path/to/directory/.syncthing/index*
Привет ты видел
Шаблоны внутренне используют filepath.Glob, синтаксис см. В filepath.Match. Дополнительно ** исключает произвольные подкаталоги. Переменные среды в файлах-исключениях раскрываются с помощью os.ExpandEnv.
в https://github.com/restic/restic/blob/master/doc/manual.rst?
Думаю, это должно ответить на ваши вопросы.
Я просмотрел документацию на https://restic.readthedocs.io/en/latest/manual.html и искал exclude, где, к сожалению, не содержит общих примеров (или ссылки на другую документацию на manual.rst ): /
Я прочитал документ golang и думаю, что конечный пользователь (я!) Не узнает, что restic сравнивает исключение с внутренним - это полный путь (например, / home / me / blah) или путь от корень репозитория (/ бла или бла), или относительно cwd (меня / бла, когда я нахожусь в / дома)?
Спасибо, что подняли этот вопрос, я думаю, вы правы. В руководстве следует объяснять фильтры исключения без ссылки на godoc.org, и необходимо больше примеров.
Чтобы уже ответить на несколько ваших вопросов:
--exclude foo
исключает любые файлы и каталоги с именем foo
. То же самое и с --exclude foo/
.Из вашего файла исключений:
._*
будет соответствовать всем файлам и каталогам, имена которых начинаются с точки и подчеркивания.desktop.ini
будет точно соответствовать всем файлам с именами desktop.ini
. Итак, desktop.ini.bak
не исключается и не сохраняется в снимке..Trash-*
исключает файлы / каталоги с именами .Trash-
, .Trash-foobar
и т. Д..tmp$
исключает все файлы / каталоги с буквальным именем .tmp$
, то есть точкой, за которой следует tmp
, за которым следует знак доллара. Нет расширения регулярного выражения.~$
исключает все файлы / каталоги, буквально названные тильдой доллар. Чтобы исключить все файлы / каталоги, заканчивающиеся тильдой, используйте *~
.~/.cache
исключает каталог .cache
из всех каталогов, называемых тильдой. Чтобы исключить каталог кеша только в вашем домашнем каталоге, используйте $HOME/.cache
(тильда не раскрывается, переменные среды есть, но только в файле, читаемом через --exclude-file
, в командной строке оболочка раскрывается оба)./full/path/to/directory/.syncthing/index*
исключает все вещи, имена которых начинаются с index
ниже /full/path/to/directory/.syncthing
.Спасибо @ fd0
Таким образом, под «текущим каталогом» вы подразумеваете не каталог, в котором я находился, когда я запускал резервную копию, но каталог, в котором находится restic, в настоящее время проверяет файлы (кроме исключений, которые начинаются с косой черты). Понятно.
Поведение файлов и каталогов несколько неожиданно, я ожидал --exclude foo / для резервного копирования каталога, но не его содержимого, тогда как --exclude foo для резервного копирования ни того, ни другого. Не уверен, почему, думаю, из rsync.
В моих примерах упущено важное: пробелы! Я думаю, мне нужно избежать этих символов и использовать метасимволы с обратной косой чертой.
В итоге я скопировал множество из них: https://gist.github.com/jult/e2eaedad6b9e29d95977fea0ddffae7d
Разрешены ли комментарии в файле исключений? Изменить: https://github.com/restic/restic/pull/916/commit/c796d84fca48feea91ca3e85fbf38e16f764a468 выглядит так, как будто хеш - это символ комментария.
Боюсь, это все еще не совсем правильно. Я опишу, как restic оценивает шаблоны исключения. Предположим, что restic запускается пользователем в своем домашнем каталоге ( /home/user
) следующим образом:
$ restic backup --exclude='*.bak' --exclude='/home/user/secret' --exclude='extra' ~
Тогда restic увидит следующие аргументы командной строки (после расширения оболочкой):
["restic", "backup", "--exclude='*.bak'", "--exclude='/home/user/secret'", "--exclude='extra'", "/home/user"]
Затем он начинает обход /home/user
. В следующем списке описывается, что происходит при просмотре указанного файла / каталога. restic всегда проверяет полный путь на соответствие шаблонам:
/home/user/foo.bak
: шаблон *.bak
совпадает, и файл не сохраняется. Шаблон не является абсолютным, поэтому он везде соответствует всем файлам, заканчивающимся на .bak
./home/user/secret
: Абсолютный шаблон /home/user/secret
совпадает, поэтому каталог не сохраняется и не просматривается/home/user/foo/home/user/secret
: Нет совпадений с шаблоном, поэтому каталог сохраняется./home/user/work/extra
: соответствует шаблону extra
, каталог не сохраняется.Надеюсь, что теперь это немного понятнее, я добавлю в руководство раздел с описанием процесса. Ключевым моментом является то, что шаблоны оцениваются по полному пути к файлам во время резервного копирования. Поэтому, если вы хотите сопоставить один каталог, используйте полный путь, иначе он может где-то совпадать несколько раз.
Есть еще вопросы? :)
У меня есть еще вопросы, и я очень ценю время, которое вы нашли, чтобы на них ответить. Это действительно один вопрос об автоматическом закреплении паттернов. Думаю, я могу угадать ответ (мы полагаемся на то, что абсолютный путь довольно уникален и дает нам желаемое поведение), но лучше спросить и быть уверенным.
Будет ли абсолютный шаблон /home/user/secret
соответствовать /home/user/secret2
? (Что, если вы этого не хотите?)
Будет ли абсолютный шаблон /home/user/secret
соответствовать /home/user/somemount/home/user/secret
?
В обоих случаях: Нет, шаблон не совпадет.
Это почему? Изменить: я рад, что это не так, но я не понимаю, почему это так :)
Соответствующий код моделируется на основе того, что будет делать оболочка: если вы спросите себя, существует ли файл /home/user/secret2
, что бы ls /home/user/secret
print (при условии, что файл secret
не существует)?
В более формальных терминах: если шаблон начинается с /
он является абсолютным, и шаблон должен совпадать в начале тестируемой строки, поэтому шаблон /home/user/secret
не соответствует /home/user/somemount[...]
: Шаблон не является префиксом строки.
Вы можете себе представить, что и шаблон, и путь к файлу разделены на соответствующие компоненты:
/home/user/secret
разбивается на [ROOT, "home", "user", "secret"]
а файл /home/user/somemount/home/user/secret
разбивается на [ROOT, "home", "user", "somemount", "home", "user", "secret"]
. Строка ROOT
используется в этом примере для обозначения корневого каталога. Вы можете видеть, что шаблон не содержится в имени файла./home/user/secret2
, который разделен на [ROOT, "home", "user", "secret2"]
. Снова вы можете видеть, что шаблон не содержится в имени файла./home/user/secret/secret.txt
, который разделен на [ROOT, "home", "user", "secret", "secret.txt"]
вы можете видеть, что шаблон действительно содержится в имени файла в самом начале: [ROOT, "home", "user", "secret", ...]
, следовательно, шаблон соответствует и файл исключен.secret/secret.txt
, который разбивается на ["secret", "secret.txt"]
. Вы можете видеть, что этот шаблон можно найти в списке для файла /home/user/secret/secret.txt
, начиная со смещения 3: [ROOT, "home", "user", "secret", "secret.txt"]
, поэтому шаблон совпадает.Когда у вас есть подстановочные знаки ( *
, ?
и т. Д.) В компоненте пути, они также проверяются. Итак, для вашего первого примера шаблон /home/user/secret*
будет соответствовать пути /home/user/secret2
.
Я думаю, что все эти примеры должны быть задокументированы в руководстве.
Попался. Спасибо.
Отрицательные исключают возможные ala .gitignore?
скажем, я хочу исключить все содержимое в каталогах с именем .meteor, за исключением вложенного каталога .meteor / local / db, могу ли я это сделать?
/ etc / restic / исключает:
.meteor/
!.meteor/local/db
restic backup exclude-file=/etc/restic/excludes
Нет, это еще не реализовано.
Документирование примеров включения / исключения отслеживается в # 396, я закрываю этот вопрос здесь.
@ fd0 я пытаюсь исключить пути, например, указанные ниже jobs / / jobs / / builds / ** / archive, чтобы исключить каталог архива из всех каталогов, которые будут работать. И у меня есть несколько таких путей, которые мне нужно исключить, если возможно, вы можете предложить мне лучший способ справиться с этим, поскольку я не могу найти ни одного примера такого рода в документации
Самый полезный комментарий
Чтобы уже ответить на несколько ваших вопросов:
--exclude foo
исключает любые файлы и каталоги с именемfoo
. То же самое и с--exclude foo/
.Из вашего файла исключений:
._*
будет соответствовать всем файлам и каталогам, имена которых начинаются с точки и подчеркивания.desktop.ini
будет точно соответствовать всем файлам с именамиdesktop.ini
. Итак,desktop.ini.bak
не исключается и не сохраняется в снимке..Trash-*
исключает файлы / каталоги с именами.Trash-
,.Trash-foobar
и т. Д..tmp$
исключает все файлы / каталоги с буквальным именем.tmp$
, то есть точкой, за которой следуетtmp
, за которым следует знак доллара. Нет расширения регулярного выражения.~$
исключает все файлы / каталоги, буквально названные тильдой доллар. Чтобы исключить все файлы / каталоги, заканчивающиеся тильдой, используйте*~
.~/.cache
исключает каталог.cache
из всех каталогов, называемых тильдой. Чтобы исключить каталог кеша только в вашем домашнем каталоге, используйте$HOME/.cache
(тильда не раскрывается, переменные среды есть, но только в файле, читаемом через--exclude-file
, в командной строке оболочка раскрывается оба)./full/path/to/directory/.syncthing/index*
исключает все вещи, имена которых начинаются сindex
ниже/full/path/to/directory/.syncthing
.