restic version
restic 0.9.6 (v0.9.6-0-gb723ca3d) 在 linux/amd64 上用 go1.10.4 编译
我在双引导 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 进行本地和远程备份。 保持良好的工作!
如果我可以在解决此问题方面提供任何其他帮助,请告诉我。
不确定--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这个问题对我来说似乎已经解决了。 如果是这种情况,请关闭它。