它出现在下面的代码中,rsync
忽略--exclude
.我该如何纠正这个问题,并将其扩展到多个目录?
$ rsync --help | grep Usage
Usage: rsync [OPTION]... SRC [SRC]... DEST
$ man rsync | grep -- '--exclude'
--exclude=PATTERN exclude files matching PATTERN
$ sudo rsync -avz --exclude='/home/erwann/.cache/' '/home/erwann' '/run/media/erwann/bkup'
sending incremental file list
erwann/.cache/mozilla/firefox/otj9do4j.default-release/cache2/
erwann/.cache/mozilla/firefox/otj9do4j.default-release/cache2/index
erwann/.cache/mozilla/firefox/otj9do4j.default-release/cache2/doomed/
erwann/.cache/mozilla/firefox/otj9do4j.default-release/cache2/entries/
答案1
模式考虑路径名的位不是源路径的一部分。这意味着要匹配目录.cache
直接地在源路径下/home/erwann
,您将使用/erwann/.cache/
作为模式(因为该/home
目录用作rsync
“transfer-root”):
rsync -av --exclude=/erwann/.cache/ /home/erwann /run/media/erwann/bkup
通过将排除模式锚定在路径的顶部/
,我们可以避免在文件层次结构的较低部分中匹配它。
/
如果在源路径的末尾添加,/home/erwann
则成为“传输根”,因此该模式可以缩短为/.cache/
.然而,我们现在还必须添加 erwann
到目标路径以获得与以前相同的效果:
rsync -av --exclude=/.cache/ /home/erwann/ /run/media/erwann/bkup/erwann
从rsync
手册:
如果您将传输视为从发送方发送到接收方的名称子树,则传输根是树在目标目录中开始复制的位置。该根控制以匹配开始的模式的位置
/
。