Я могу проигнорировать файлы шаблоном в deja-дубликате (Резервное копирование)?

Мои резервные копии Дубликата Déjà стали тихими большой, и я заметил, что они содержат огромное количество ненужных файлов (например. *.pyc файлы, **__pycache__ папки и другая сборка связали временный материал).

Я знаю, что могу проигнорировать определенные папки, но являюсь там способом исключить файлы и или папки шаблонами?

Я думал, что могло бы быть больше опций применимая канавка конфигурационный файл, но Дубликат Déjà не использует тот. Таким образом, я посмотрел на двуличность (CLI, который это на основе), но страница справочника не упоминает конфигурационный файл также. Я знаю, что двуличность может проигнорировать файлы и папки на основе шаблонов (--exclude, --exclude-filelist), но я понятия не имею, как объединить это с Дубликатом Déjà.

Я имею к Дубликату канавы Déjà и использую двуличность вручную? Или есть ли способ установить необходимые опции, так, чтобы они использовались автоматически, когда двуличность используется Дубликатом Déjà?

24
задан 28 October 2015 в 03:24

11 ответов

Вы можете редактировать список исключений, например:

gsettings get org.gnome.DejaDup exclude-list
# remove comment to execute
# gsettings set org.gnome.DejaDup exclude-list ['path1', 'path2']

Источник: https://answers.launchpad.net/deja-dup/+question/280954

Я пытался добавить в этот список шаблоны вроде '** /. git' и '** / build', например:

gsettings get org.gnome.DejaDup exclude-list > exclude-list
gedit exclude-list
gsettings set org.gnome.DejaDup exclude-list "`cat exclude-list`"

Но мне кажется, что ** не были переданы на дублирование. Поэтому вместо этого я закончил поиски вроде

locate "/home/*/.svn"
locate "/home/*/build"

и вручную добавил их в список исключений

6
ответ дан 23 November 2019 в 03:42

В настоящее время с Deja Dup нет способа сделать такую расширенную фильтрацию. Смотрите ошибку upstream https://bugs.launchpad.net/deja-dup/+bug/374274

4
ответ дан 23 November 2019 в 03:42

Я попробовал метод Якоба Нордфалька , но он не сработал у меня (возможно, изменился синтаксис).

Однако мне удалось изменить настройку с помощью dconf-editor . Вы можете изменить список по пути / org / gnome / deja-dup / exclude-list

2
ответ дан 23 November 2019 в 03:42

К сожалению, ни Duplicity, ни Déjà Dup не используют конфигурационный файл :( Но может быть возможный обходной путь, пользователь @mterry упомянул следующее в сообщении об ошибке @mterry, связанном с вышеизложенным:

, если вы прочитаете список исключений и добавите шаблоны типа "**/parts", то шаблон будет передан на дублирование, и все будет работать, как и ожидалось. ..."

Где хранятся настройки gconf в эти дни?

0
ответ дан 23 November 2019 в 03:42

Я успешно добился исключения, используя мой файл include_list.txt , содержащий:

- /home/justin/**/.insync-trash
- /home/justin/**/__pycache__
- /home/justin/**/*.pyc
- /home/justin/**/node_modules
- /home/justin/**/Google Photos
+ /home/justin/Documents
- /home/justin/*

/ ** / ] важно соответствовать любой глубине каталога.

Правило 1. Порядок важен. Сначала будьте конкретными, а потом общими.

Правило 2: То, что уже было сопоставлено в строке (включить или исключить), не может быть изменено последующими совпадениями в последующих строках. В документации это упоминается; но на ужасно запутанном английском. Надеюсь, моя лучше;) Строки выше достигают:

  • Строка 1: исключить любые __ pycache __ на любой глубине.
  • Строка 2: исключить любой файл с расширением .pyc .
  • Строка 6: включить мою конкретную и единственную папку Документы .
  • Строка 7: исключить все остальные мои домашние папки, такие как Изображения , Видео , Загрузки и т. Д. Обратите внимание, что это не может помешать включению документов , поскольку они уже были сопоставлены в строке 6! Порядок имеет значение!
0
ответ дан 23 November 2019 в 03:42

Получите текущий список исключений с помощью:

$ gsettings get org.gnome.DejaDup exclude-list

, который дает что-то вроде:

['', '/home/me/delete_me', '/home/me/eclipse', '/home/me/Music', '/home/me/R', '/home/me/Videos']

Затем установите новый список, заключив старый вывод в кавычки и добавив свои изменения:

$ gsettings set org.gnome.DejaDup exclude-list "[ '', '/home/me/delete_me', '/home/me/eclipse', '/home/me/Music', '/home/me/R', '/home/me/Videos', '/home/me/**/.git']"

и снова запустите get, чтобы проверить ваши изменения.

1
ответ дан 23 November 2019 в 03:42
  1. установить dconf-editor
sudo apt install dconf-editor
  1. запустить dconf-editor как обычный пользователь. (не используйте sudo )
dconf-editor
  1. найдите org -> gnome -> deja-dup -> исключить -list
  2. установить пользовательское значение на (замените leo своим именем пользователя)
['$TRASH', '$DOWNLOAD', '/home/leo/.anaconda', '/home/leo/**/node_modules', '/home/leo/**/__pycache__', '/home/leo/**/*.pyc']
  1. Вам может потребоваться перезагрузка / повторный вход. Я запускаю снимок экрана, который автоматически обновляет значение. Не знаю почему, может кто-нибудь еще объяснит.

Снимки экрана:

Замените leo своим именем пользователя

replace 'leo' with your user name

It should look like this way

4
ответ дан 23 November 2019 в 03:42

Использование шаблонов ** не работает (больше), потому что deja-dub экранирует символы [? * В команде duplicity. См. https://git.launchpad.net/deja-dup/tree/libdeja/tools/duplicity/DuplicityJob.vala#n303 :

  string escape_duplicity_path(string path)
  {
    // Duplicity paths are actually shell globs.  So we want to escape anything
    // that might fool duplicity into thinking this isn't the real path.
    // Specifically, anything in '[?*'.  Duplicity does not have escape
    // characters, so we surround each with brackets.
    string rv;
    rv = path.replace("[", "[[]");
    rv = rv.replace("?", "[?]");
    rv = rv.replace("*", "[*]");
    return rv;
  }

  void process_include_excludes()
  {
    expand_links_in_list(ref includes, true);
    expand_links_in_list(ref excludes, false);

    // We need to make sure that the most specific includes/excludes will
    // be first in the list (duplicity uses only first matched dir).  Includes
    // will be preferred if the same dir is present in both lists.
    includes.sort((CompareFunc)cmp_prefix);
    excludes.sort((CompareFunc)cmp_prefix);

    foreach (File i in includes) {
      var excludes2 = excludes.copy();
      foreach (File e in excludes2) {
        if (e.has_prefix(i)) {
          saved_argv.append("--exclude=" + escape_duplicity_path(e.get_path()));
          excludes.remove(e);
        }
      }
      saved_argv.append("--include=" + escape_duplicity_path(i.get_path()));
      //if (!i.has_prefix(slash_home_me))
      //  needs_root = true;
    }
    foreach (File e in excludes) {
      saved_argv.append("--exclude=" + escape_duplicity_path(e.get_path()));
    }

    // TODO: Figure out a more reasonable way to order regexps and files.
    // For now, just stick regexps in the end, as they are more general.
    foreach (string r in exclude_regexps) {
      saved_argv.append("--exclude=" + r);
    }

    saved_argv.append("--exclude=**");
  }
6
ответ дан 23 November 2019 в 03:42

Этот ответ является вариантом ответа Даана Коэценруйтера , который основывался на половине нити здесь и на ответе LeoZ . Так что это ремикс большей части этой ветки. Я сделал ремикс, потому что мне нужен был больший контроль над тем, что происходит, и мне не нравится, вероятно, немного протестированный (python) скрипт, который я могу читать только для того, чтобы повредить мои настройки. Это не критика Даана, это моя проблема - большое спасибо Даану (и LeoZ тоже), вы в основном решили это за меня!

Итак, я написал небольшую командную строку, которая выгружает файлы, которые я хочу исключить, и скопируйте это в соответствующее значение в редактор dconf (см. ответ LeoZ!).

И это пример такой командной строки:

find /home/myUserName -name node_modules -printf "'%P',\n" | grep -v 'node_modules/.*/node_modules' | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'

Это выполняет три вещи. Первая команда "find" находит все каталоги, которые я хочу исключить (в данном случае node_modules), и форматирует их в требуемый формат с помощью "-printf". Не выполняйте «find. [...]», потому что тогда вывод также будет относительным, но вам нужен абсолютный (и, очевидно, замените мое имя пользователя). Обратите внимание, что -printf добавляет новую строку. Это сделано для того, чтобы упростить следующую команду, новая строка будет удалена последней командой. В зависимости от вашего варианта использования вы можете упростить это.

Вторая команда «grep» удаляет вложенные каталоги node_modules, в моем случае уменьшая количество исключенных записей с 15 000 до 250 или около того.

Наконец, sed удаляет новые строки снова. Это можно упростить, если не добавлять новые строки в первую очередь и использовать более умный regExp в grep, но меня это не беспокоило: -)

Я рекомендую удалить команду "sed" и сначала просмотреть список исключений.

Предостережения: Если у вас есть символы 'в именах файлов / каталогов, которые вы хотите исключить, вам нужно решить другую проблему, но редактор dconf, вероятно, спасет вас от нарушения ваших настроек (он проверяет синтаксис). Думаю, есть еще кое-что, что может пойти не так, так что будьте осторожны.

Спасибо всем в этой ветке за вашу помощь!

1
ответ дан 5 January 2021 в 22:48

Итак, я написал небольшой сценарий для решения проблемы с файлом .dejadupignore. Но прежде чем углубиться в это, я должен сказать, что, по крайней мере, стоит погрузиться в дублирующие документы, используя include_list.txt, как предлагает ответ Джастина Солмса и более подробно объясняется в этой публикации. .

Сценарий сначала выбирает уже существующие игнорирования, затем использует команду locate для каждой строки регулярного выражения, указанной в .dejadupignore, и добавляет все найденные местоположения в единый массив. Наконец, он вызывает команду gsettings, предложенную Полом Смитом , чтобы добавить все найденные файлы для игнорирования в список исключений DejaDup.

Однако серьезным препятствием является ulimit, который в Linux по умолчанию равен 8192. И даже после того, как я расширил его, он не смог справиться с количеством местоположений __pycache__ в качестве аргумента команды gsettings.

В любом случае, надеюсь, это кому-нибудь пригодится.

import subprocess, os
from ast import literal_eval
from subprocess import PIPE


raw_lines = subprocess.run('gsettings get org.gnome.DejaDup exclude-list'.split(' '), stdout=PIPE, stderr=PIPE).stdout.decode('utf-8')
ignore_lines = literal_eval(raw_lines)

with open('.dejadupignore', 'r') as f:
    contents = f.readlines()

lines = [l.rstrip('\n') for l in contents]
for line in lines:
    line = os.path.expanduser(line)
    p = subprocess.run(["locate", line], stdout=PIPE, stderr=PIPE, shell=True)
    pstring = p.stdout.decode('utf-8')
    to_ignore = pstring.split('\n')
    to_ignore = [i for i in to_ignore if i != '']
    ignore_lines.extend(to_ignore)

command = 'gsettings set org.gnome.DejaDup exclude-list'.split(' ') 
command.extend([str(ignore_lines)])

for line in ignore_lines:
    print(line)

def smallfunk():
    i = input("Do you want to add these lines to the DejaDup exclude list? \n Press 'y' for yes and 'n' for no \n")
    if i == 'y':
        subprocess.run(command)
    elif i == 'n':
        pass
    else:
        print('Not an option')
        smallfunk()


smallfunk()

С файлом .dejadupignore:

~/*/venv
~/*/.pyc
~/*/git
~/*/.git
1
ответ дан 5 January 2021 в 22:48

Если вы видите, что у моего текущего рабочего каталога нет файла/каталога, полное имя пути начинается с/bin/bash. Следовательно, мы не должны быть получение любого выходного сигнала от locate/bin/bash *

Нет, это не так - /bin/bash * соответствует , включая путь, поэтому, учитывая, что он находит совпадение (т.е. /bin/bash ), это аргумент, который locate получит. Это можно проверить, выполнив команду с параметром debug оболочки -x :

$ set -x
$ 
$ locate /bin/bash*
+ locate /bin/bash
/bin/bash
/snap/core/10577/bin/bash
/snap/core/10577/usr/bin/bashbug
/snap/core/10583/bin/bash
/snap/core/10583/usr/bin/bashbug
/snap/core18/1932/bin/bash
/snap/core18/1932/usr/bin/bashbug
/snap/core18/1944/bin/bash
/snap/core18/1944/usr/bin/bashbug
/usr/bin/bashbug

Поскольку (расширенный) образец не содержит символов глоббинга, он эквивалентен */bin/bash * .

Более интересный вопрос, почему он не находит /bin/bash сам, учитывая, что оболочка, очевидно, делает - я думаю, это потому, что /bin связан с /usr/bin на более новых версиях Ubuntu - и updatedb не записывает symlinks.

-121--911292-

Сначала

Команда locate соответствует предоставленному образцу в ее базу данных. Вот как это работает. Это означает две вещи:

  • Все, что вы пытаетесь найти, должно находиться в его базе данных, и недостаточно, чтобы оно существовало в вашей файловой системе. База данных должна обновляться регулярно, но иногда для этого требуется время, и для этого вручную используется команда sudo updatedb

  • Учитывая вышеприведенное, как работает locate , это не имеет никакого значения, из какого каталога выполняется команда locate , поскольку locate сам не выполняет поиск или даже не видит текущий каталог. Он знает только свою базу данных.

Во-вторых

При передаче незащищенного (незацененного) шаблона , содержащего символы глоббинга для поиска, шаблон не передается в locate . То, что передается locate в этом случае является расширенная версия, сделанная самой оболочкой и которая может содержать всевозможные вещи, что послесловия будут рассматриваться как несколько узоры locate и будет сравнивать все это с его базой данных и печатать вывод соответственно. У вас нет надежного способа управлять тем, что передается в местоположение в этом случае, и решение зависит от оболочки.

Правильный способ предотвратить вмешательство оболочки и расширение узоров с глобулирующими символами в них состоит в том, чтобы защитить или избежать этих символов. Короче говоря, используйте кавычки либо одинарные, либо двойные вокруг образца, например:

locate '/bin/bash*'
-121--911293-

Я придумал для этого рабочий обходной путь. Проблема, кажется, заключается в том, что двуличие само по себе не расширяет подстановочные знаки (за исключением * *, по-видимому), а полагается на оболочку, чтобы сделать это, и когда она запускается от deja-dup нет участия оболочки, поэтому теперь блокирует настройку подстановочных знаков исключает. Конечно, вы можете использовать dconf-редактор, чтобы принудить их в сохраненный список исключений, но они не работают (из мониторинга в сценарии ниже я на самом деле обнаружил, что deja-dup отбрасывает исключения, содержащие «*», и вовсе не передает их двуличию).

Чтобы это сработало, нам нужно расширение оболочки подстановочных знаков. Это можно сделать вручную и вставить результаты с помощью редактора dconf, как предложено здесь, но это решение делает это автоматически во время выполнения резервного копирования.

Сначала найдите, где двуличие находится на вашем пути («какая двуличность»), затем найдите местоположение пути перед ним в пути («echo $ PATH»). В моем случае это/usr/bin/duplicity и/usr/local/bin идет впереди этого, что идеально. Создайте текстовый файл с именем duplicity в этом последнем расположении пути (например ,/usr/local/bin/duplicity), сделайте его исполняемым (chmod + x...) и поместите туда это содержимое:

#! /bin/bash

# Shim script run from deja-dup in place of duplicity, to add in file/pattern
# exclude arguments for duplicity.
#
# The excludes are read from ~/.config/deja-dup-excludes (one-per-line).

ARGS="$*"

EXCLUDES=$(cat $HOME/.config/deja-dup-excludes | sed -e 's/#.*$//' -e 's/^[ \t]*//' -e '/^$/d')

if ( echo "$ARGS" | grep -q '\--exclude'); then
    for EXCL in $EXCLUDES
    do
        EXCL_ARG=$(find $EXCL -printf '--exclude %p ')

        ARGS="$EXCL_ARG$ARGS"
    done
fi  

#echo "$ARGS" >>/tmp/dup.out

/usr/bin/duplicity $ARGS

Убедитесь, что последняя строка имеет правильный путь для реальной duplicity на вашем компьютере, и вы можете отменить комментарий оператора эхо, если хотите проверить свою работу.

Затем создайте файл .config/deja-dup-excludes в вашем домашнем каталоге с перечисленными исключениями по одной строке, например:

# Exclude files/patterns for deja-dup
# (used by the /usr/local/bin/duplicity script).

/home/Ian/core.*
/etc/postfix/sasl_passwd*

Любые строки, начинающиеся с «#», будут приниматься как строки комментариев и игнорироваться.

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

Взлом, надо признать, но он работает как прелесть.

3
ответ дан 2 April 2021 в 00:30

Другие вопросы по тегам:

Похожие вопросы: