我正在尝试使用 rysnc 进行多级增量备份,但是遇到了一些问题。似乎 rsync 无法识别 compare-dest 中的通配符。我运行以下代码
rsync -av /home/j/test/source/ --compare-dest=/home/j/test/destination/*/ /home/j/test/destination/00/
它会给我以下消息。
--compare-dest arg does not exist: /home/j/test/destination/*
即使尝试再次运行代码并将备份放在新目录中,我仍然遇到此问题
rsync -av /home/j/test/source/ --compare-dest=/home/j/test/destination/*/ /home/j/test/destination/01/
在第二次尝试时,它会将所有内容从源文件夹复制到目标/01/,而不是像我们使用通配符那样在目标目录内的所有目录中查找更改。
目的是能够不断在目标目录中创建新目录,这些新目录执行源的增量备份,同时比较所有以前的备份。不确定如何让通配符与 --compare-dest 配合使用,我见过其他人将它们与 rsync 一起使用来做非常类似的事情。
我在 WSL2 上运行 Ubuntu,并在运行 Ubuntu 22.04 的服务器上尝试了同样的操作。如果能提供一些指导,我将不胜感激。
谢谢,
J
答案1
以下是具体情况:
- 您的命令包含通配符。通常,此类内容将被处理和扩展通过 shell
rsync
甚至在运行之前。但是,在这种情况下,shell 看到的是字符串--compare-dest=/home/j/test/destination/*/
,由于它与目录路径不匹配,因此它保持不变。 - 该
rsync
命令现在已执行,在解析其参数后,最终得到compare-dest
一个包含星号的目录路径。需要注意的是,此时星号是一个文字字符,这就是rsync
尝试使用的字符。(从概念上讲,*
用诸如 . 之类的词替换STAR
) - 该
rsync
命令找不到匹配的目录路径包含文字星号作为目录名称(即“/home/j/test/destination/*
”)并失败并出现您看到的错误。
如果您可以保证只有一个目录与路径匹配,/home/j/test/destination/*/
则可以重复该rsync
命令,但不使用=
:
rsync -av --compare-dest /home/j/test/destination/*/ /home/j/test/source/ /home/j/test/destination/00/
从语义上讲,这是相同的,但这次 shell 会解析/home/j/test/destination/*/
并尝试将通配符扩展为一个或多个匹配的目录。
不过,有两点非常重要:
- 如果路径扩展失败,
*
将保留为文字字符,并且您将再次从“rsync”收到错误。 - 如果扩展导致多个目录路径,则第二个及后续路径将被视为附加源目录,从而
rsync
导致混乱。这会很糟糕。
如果你不能保证只有一个匹配项,你可以使用{…}
带通配符的括号扩展模式--compare-dest=/path/…
,它将针对与通配符路径匹配的目录集重复尽可能多的次数。例如:
dirs=(/home/j/test/destination/*/)
echo "dirs=( ${dirs[*]} )"
echo rsync -av "${dirs[@]/#/--compare-dest=}" /home/j/test/source/ /home/j/test/destination/00/
对于您的特定场景,几乎肯定会有更好的解决方案,但如果不了解进一步的细节,就不可能推荐理想的解决方案。