Restic: 使用排除文件排除 $RECYCLE.BIN 不起作用

创建于 2020-05-31  ·  4评论  ·  资料来源: restic/restic

restic version

restic 0.9.6 (v0.9.6-0-gb723ca3d) 在 linux/amd64 上用 go1.10.4 编译

你是如何运行restic的?

我在双引导 Windows 10 和 Ubuntu 18.04 之间共享了一个 NTFS 分区,我用 Ubuntu 的 restic 备份了它。 您可能知道,Windows 10 在分区的根目录中创建了一个目录$RECYCLE.BIN来保存移动到回收站的文件。 我确实想备份共享分区,但不想备份$RECYCLE.BIN目录。

下面我详细描述了如何重现我所观察到的内容。 长话短说:将--exclude="\$RECYCLE.BIN"与备份命令一起使用确实排除了目录,将“$RECYCLE.BIN”(或我能想到的任何其他变体,见下文)放入--exclude-file中不排除目录。

您使用什么后端/服务器/服务来存储存储库?

我观察了本地存储库(在 Ubuntu 18.04 下)和通过 SFTP 的远程存储库(备份也在 Ubuntu 18.04 上运行)的行为。

预期行为

添加到排除文件时,文件夹$RECYCLE.BIN将从备份中排除。

实际行为

文件夹$RECYCLE.BIN包含在备份中,但已添加到排除文件中。

重现行为的步骤

在临时测试目录中,在 bash 中发出以下命令:

# prepare the directory to be backed up
mkdir "data";
mkdir "data/\$RECYCLE.BIN";
touch "data/backup_this";
touch "data/\$RECYCLE.BIN"/ignore_this";

# init repo
mkdir "repo";
restic init --repo=repo/

# prepare exclude file
echo "\$RECYCLE.BIN" > exclude.file

现在发行restic --repo=repo/ backup --verbose --verbose data/收益率:

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
start scan on [data/]
start backup on [data/]
scan finished in 0.257s: 2 files, 0 B
new       /data/$RECYCLE.BIN/ignore_this, saved in 0.004s (0 B added)
new       /data/backup_this, saved in 0.000s (0 B added)

Files:           2 new,     0 changed,     0 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      1 new
Added to the repo: 372 B

processed 2 files, 0 B in 0:00
snapshot 27c00c6b saved

正如预期的那样。

发行restic --repo=repo/ backup --verbose --verbose --exclude="\$RECYCLE.BIN" data/收益

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 27c00c6b
start scan on [data/]
start backup on [data/]
scan finished in 0.257s: 1 files, 0 B
unchanged /data/backup_this

Files:           0 new,     0 changed,     1 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      1 new
Added to the repo: 372 B

processed 1 files, 0 B in 0:00
snapshot 61c27a16 saved

这也是意料之中的。

但是,发出restic --repo=repo/ backup --verbose --verbose --exclude-file=exclude.file data/ ,其中

 $ cat exclude.file 
$RECYCLE.BIN

结果是

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 61c27a16
start scan on [data/]
start backup on [data/]
scan finished in 0.211s: 2 files, 0 B
unchanged /data/backup_this
new       /data/$RECYCLE.BIN/ignore_this, saved in 0.003s (0 B added)

Files:           1 new,     0 changed,     1 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      0 new
Added to the repo: 0 B  

processed 2 files, 0 B in 0:00
snapshot 9a62470f saved

也就是说,尽管该目录存在于排除文件中,但并未从备份中排除该目录。

我也尝试了排除文件的不同变体(转义美元符号、添加引号、在文件末尾添加换行符),但没有任何内容可以排除目录。

你知道是什么原因造成的吗?

我认为在处理包含讨厌字符(如美元符号)的排除文件中的文件名时,肯定会出现一些错误。

你知道如何解决这个问题吗?

不幸的是,我对 go 一无所知(我只精通 C++),但是在处理包含奇怪字符的文件名时,与操作系统和/或文件系统的交互一定有问题。

今天restic对你有帮助吗? 它有没有让你开心?

我广泛使用 restic 进行本地和远程备份。 保持良好的工作!
如果我可以在解决此问题方面提供任何其他帮助,请告诉我。

backup need feedback questioproblem

所有4条评论

不确定--exclude ,但在排除文件中,restic 扩展了环境变量。 使用$$RECYCLE.BIN来避免这种情况。

请参阅: https: //restic.readthedocs.io/en/latest/040_backup.html# exclude -files

好吧,谢谢,看来我确实忽略了文档中的这一段。

它似乎解决了:

 $ cat exclude.file 
$$RECYCLE.BIN

并再次发行restic --repo=repo/ backup --verbose --verbose --exclude-file=exclude.file data/收益率

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 96bdd658
start scan on [data/]
start backup on [data/]
scan finished in 0.211s: 1 files, 0 B
unchanged /data/backup_this

Files:           0 new,     0 changed,     1 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      0 new
Added to the repo: 0 B  

processed 1 files, 0 B in 0:00
snapshot 5c475b96 saved

正如预期的那样。

然而,在现在超过 10 年的 Linux 经验中,我从未遇到过必须通过$$而不是\$来逃避$ \$ ,但正如文档所述,这似乎是标准的对于os.ExpandEnv ,所以这不是特定于restic。

然而, restic --repo=repo/ backup --verbose --verbose --exclude="$$RECYCLE.BIN" data/收益

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 5c475b96
start scan on [data/]
start backup on [data/]
scan finished in 0.204s: 2 files, 0 B
new       /data/$RECYCLE.BIN/ignore_this, saved in 0.002s (0 B added)
unchanged /data/backup_this

Files:           1 new,     0 changed,     1 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      0 new
Added to the repo: 0 B  

processed 2 files, 0 B in 0:00
snapshot ed44b219 saved

这似乎非常不一致和违反直觉。

--exclude="$$RECYCLE.BIN"的双引号表示shell 将$$扩展为当前PID。 用单引号试试: --exclude='$$RECYCLE.BIN'

(例如看看echo "$$RECYCLE.BIN"echo '$$RECYCLE.BIN'

@kontakm这个问题对我来说似乎已经解决了。 如果是这种情况,请关闭它。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

e2b picture e2b  ·  4评论

TheLastProject picture TheLastProject  ·  3评论

fd0 picture fd0  ·  3评论

jpic picture jpic  ·  3评论

mholt picture mholt  ·  4评论