在 Linux 上同步不可变文件夹(rsync/unison/其他?)

在 Linux 上同步不可变文件夹(rsync/unison/其他?)

考虑以下目录布局:

/foo
  /ABZE1
     a1.txt
     a2.txt
     ...
     a59682.txt
  /BBSDF
     b1.txt
     b2.txt
     ....
     b42333.txt
  ...

foo是父文件夹,它的每个子目录(ABZE1,,BBSDF...)实际上都是不可变的因为它有一个唯一的名称,暗示了它的版本。这意味着一旦创建了这样的子目录,它绝不修改。此外,每个子目录都有很多文件数(有时 > 100K)。

foo我需要进行双向同步foo-remote(在同一台机器上安装 NFS)。

rsync可以完成这项工作,但它的性能较差,因为它会检查全部这些文件。如果我能rsync检查一下仅限文件夹那就行了。 也一样unison

我们是否可以rsync将文件夹视为要比较的实体(而不是子文件夹内的文件)?还有其他工具可以实现这种同步吗?

答案1

据我所知,您要求的rsync是不可能的。但是,以下命令

diff <(ls) <(ssh me@remote "cd /path/to/remote/backup/directory && ls") 

一口气列出两个目录结构之间的差异,识别它们之间的差异。请注意,如果您在远程服务器上设置了通过加密密钥进行身份验证,则此方法有效,否则您将被要求输入密码,这可能会搞乱整个过程。

如果你愿意,你可以让它跳过文件(因此可能工作得更快),通过将其修改为:

diff <(find . -type d)  <(ssh me@remote "cd /path/to/remote/backup/directory && find . -type d") 

上述命令仅查询目录。

您现在可以通过以下方式解析它:

 ...(command above)... | grep "<" | awk '{print $2}'

它只会输出第一台电脑上存在的目录名称,但第二台电脑上不存在(因为我使用了grep "<"而不是grep ">")。

rsync现在对于仅通过这种方式发现的目录来说应该是微不足道的。

相关内容