我正在尝试使用一致(版本2.48.3)在两台机器(都是ubuntu 16.04)之间同步目录的子集。在两台计算机上,我都有一个名为“research”的目录。它包含我正在处理的每个项目的文件夹。在这些文件夹中的每个文件夹中,都有一个名为“lit”的文件夹,我想使所有这些“lit”文件夹保持一致,而不必真正关心项目名称本身。
示例:在两台计算机上,都有以下文件夹:

/home/chris/research/projA/lit
/home/chris/research/projA/otherstuff
/home/chris/research/projB/lit
/home/chris/research/projB/otherstuff

其中,我想在两台机器之间同步projA/lit,还希望在projB/lit之间同步。

我已经安装了统一程序,并通过联机帮助页阅读了自己的内容。基于此,我对统一配置文件default.prf进行了如下修改:
# Unison preferences file
# used for syncing lit between work and home

# roots
root = /home/chris/research
root = ssh://pc-work//home/chris/research

# paths
path = */lit

统一成功连接到我的工作计算机后,它没有任何要同步的内容。
相反,如果我在上面的配置文件path = */lit中将其替换为path = projA/lit,那么它将起作用。

因此,出现了一个问题:是否可以统一为所有项目同步lit子文件夹,而不必指定这些项目;如果是,如何进行?还是我必须在某种循环中包装统一命令,以便遍历所有项目文件夹?

最佳答案

path不是实现您想要的正确方法。从path上的documentation:

请注意,path首选项按字面意义进行解释-它们不是正则表达式。

即使您不是使用正则表达式,而是使用Shell Glob,我还是认为path的值不是由unison专门解释的。

但是,通过明智地使用ignore和/或ignorenot可以达到想要的效果。那些确实允许外壳程序或正则表达式。

例如,(免责声明:我尚未对此进行测试)

ignore = Path proj*/otherstuff

您想要在同步时跳过的任何目录。如果要跳过的目录比同步的目录还多,也可以用另一种方式指定它:
ignore = Path proj*/*
ignorenot = Path proj*/lit

请注意,如果要同步的文件和目录已经直接位于指定的path下,则无需设置root

10-08 04:24