Rsync Compare-Dest 无法识别通配符

Rsync Compare-Dest 无法识别通配符

我正在尝试使用 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

以下是具体情况:

  1. 您的命令包含通配符。通常,此类内容将被处理和扩展通过 shellrsync甚至在运行之前。但是,在这种情况下,shell 看到的是字符串--compare-dest=/home/j/test/destination/*/,由于它与目录路径不匹配,因此它保持不变。
  2. rsync命令现在已执行,在解析其参数后,最终得到compare-dest一个包含星号的目录路径。需要注意的是,此时星号是一个文字字符,这就是rsync尝试使用的字符。(从概念上讲,*用诸如 . 之类的词替换STAR
  3. 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/*/并尝试将通配符扩展为一个或多个匹配的目录。

不过,有两点非常重要:

  1. 如果路径扩展失败,*将保留为文字字符,并且您将再次从“rsync”收到错误。
  2. 如果扩展导致多个目录路径,则第二个及后续路径将被视为附加源目录,从而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/

对于您的特定场景,几乎肯定会有更好的解决方案,但如果不了解进一步的细节,就不可能推荐理想的解决方案。

相关内容