![在 Linux 上同步不可变文件夹(rsync/unison/其他?)](https://linux22.com/image/1501509/%E5%9C%A8%20Linux%20%E4%B8%8A%E5%90%8C%E6%AD%A5%E4%B8%8D%E5%8F%AF%E5%8F%98%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%88rsync%2Funison%2F%E5%85%B6%E4%BB%96%EF%BC%9F%EF%BC%89.png)
考虑以下目录布局:
/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
现在对于仅通过这种方式发现的目录来说应该是微不足道的。