我可以在deja-dup(备份)中按模式忽略文件吗?


13

我的DéjàDup备份变得非常安静,我注意到它们包含大量不必要的文件(例如,*.pyc文件,**__pycache__文件夹和其他与构建相关的临时文件)。

我知道我可以忽略特定的文件夹,但是有没有办法按模式排除文件和/或文件夹?

我认为通过配置文件可以使用更多选项,但是DéjàDup不使用一个选项。因此,我研究了重复性(基于它的CLI),但是手册页也没有提到配置文件。我知道重复性可以忽略基于模式(--exclude--exclude-filelist)的文件和文件夹,但是我不知道如何将其与DéjàDup结合使用。

我是否必须抛弃DéjàDup并手动使用重复性?还是有一种方法来设置所需要的选项,因此它们可以自动使用,当两面三刀所使用的DéjàDup的

Answers:



4

您可以编辑排除列表,例如:

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"

并将它们手动添加到排除列表


3

使用**模式不再(不再)有效,因为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=**");
  }

3
  1. 安装 dconf-editor
sudo apt install dconf-editor
  1. dconf-editor以普通用户身份运行。(不要使用sudo
dconf-editor
  1. 找到组织 -> gnome- > deja-dup- > exclude-list
  2. 将“ 自定义值”设置为(用您的用户名替换leo
['$TRASH', '$DOWNLOAD', '/home/leo/.anaconda', '/home/leo/**/node_modules', '/home/leo/**/__pycache__', '/home/leo/**/*.pyc']
  1. 您可能需要重新启动/重新登录。我运行屏幕截图,该屏幕截图会自动更新值。我不知道为什么,也许别人可以解释。

屏幕截图:

用您的用户名替换leo

用您的用户名替换“ leo”

它看起来应该像这样


我试过了,~/**/node_modules确实在“忽略的文件夹” 中显示了,但是仍然备份了...,所以似乎不起作用...
musicformellons

2

我尝试了Jacob Nordfalk的方法,但是它对我不起作用(也许语法已更改)。

但是,我可以使用更改设置dconf-editor。您可以在路径下修改列表/org/gnome/deja-dup/exclude-list


1

使用以下方法获取当前排除列表:

$ 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来验证您的更改。


0

可悲的是,DuplicityDéjàDup都没有使用配置文件:(但是可能有一种解决方法,用户@mterry在上面链接的错误报告中提到了以下内容:

如果您用gconf编辑排除列表并添加“ **/parts”之类的模式,则该模式将传递给重复性,一切都会按预期进行...”

现在,这些天的gconf设置存储在哪里?


1
org -> gnome -> deja-dup又名org.gnome.DejaDup。不过,对我不起作用。
esmail 2015年

您可以像这样编辑排除列表:gsettings获取org.gnome.DejaDup排除列表gsettings设置org.gnome.DejaDup排除列表['path1','path2']
Jacob Nordfalk

0

我使用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行:包括我的特定Documents文件夹。
  • 7号线:排除所有我的其他主文件夹,如PicturesVideosDownloads,等。注意,这不能阻止Documents被列入,因为它是在6号线已经匹配!订单很重要!

1
我猜您是include_list.txt通过直接从命令行调用重复性来使用文件的吗?您是否知道有任何方法可以使这样的模式列表与Ubuntu的默认DéjàDup GUI配合使用?(顺便说一句:给我一个包含包含和排除模式的文件命名似乎让我感到困惑include_list.txt……)
Salim B
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.