Restic: Не удается найти документы для синтаксиса файла исключения

Созданный на 8 июн. 2017  ·  17Комментарии  ·  Источник: restic/restic

Кажется, я не могу найти никаких документов о том, как анализируется синтаксис файла исключения.

т.е. поддерживает ли он подстановочные знаки? регулярное выражение? как он различает файлы и каталоги? нужны ли префиксы пути? откуда (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*
documentation wanted

Самый полезный комментарий

Чтобы уже ответить на несколько ваших вопросов:

  • Все шаблоны проверяются по полному пути к сохраняемому файлу / директории.
  • Относительные пути / шаблоны будут совпадать в любом месте под сохраняемым путем.
  • На данный момент нет возможности отличить файл от каталога, поэтому --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 .

Все 17 Комментарий

Привет ты видел

Шаблоны внутренне используют 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 всегда проверяет полный путь на соответствие шаблонам:

  • file /home/user/foo.bak : шаблон *.bak совпадает, и файл не сохраняется. Шаблон не является абсолютным, поэтому он везде соответствует всем файлам, заканчивающимся на .bak .
  • dir /home/user/secret : Абсолютный шаблон /home/user/secret совпадает, поэтому каталог не сохраняется и не просматривается
  • dir /home/user/foo/home/user/secret : Нет совпадений с шаблоном, поэтому каталог сохраняется.
  • dir /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, чтобы исключить каталог архива из всех каталогов, которые будут работать. И у меня есть несколько таких путей, которые мне нужно исключить, если возможно, вы можете предложить мне лучший способ справиться с этим, поскольку я не могу найти ни одного примера такого рода в документации

Была ли эта страница полезной?
0 / 5 - 0 рейтинги