如何在Linux上创建一个带有链接的目录副本

7
我在Linux上有一系列目录,每个目录都包含大量的文件和数据。这些目录中的数据是自动生成的,但多个用户需要对这些数据进行更多的分析、生成更多的文件、更改结构等操作。
由于这些数据目录非常大,我不希望几个人都复制原始数据,因此我想复制该目录并从新目录链接到原始目录。然而,我希望任何更改都只保留在新目录中,并将原始目录设置为只读。我不想仅链接我定义的特定文件,因为这些目录中的数据如此多样化。
因此,我想知道是否有一种方法可以通过链接到原始目录来创建目录的副本,但只在新目录中保留任何更改的文件。
2个回答

23

结果证明这正是我想要的:

cp -al <origdir> <newdir>

它将复制整个目录并创建到原始文件的硬链接。如果删除原始文件,复制的文件仍然存在,反之亦然。这将完美地工作,但我发现newdir必须不存在。只要原始文件是只读的,您就能够创建一个完全相同、安全的原始目录副本。


1
当原始文件不是只读时,可以实现此操作,但对任何一个副本所做的更改都将同样地应用于两个副本,因此如果您想修改复制的文件而不修改原始文件,则硬链接不合适。 - thomasrutter
如果文件是只读的,那么修改(并保存)该文件的任何程序都必须覆盖该文件,而不是在原地修改它。对于 cp 命令,cp -f 可以实现此功能。 - palswim

2
然而,由于您正在寻找一种人们可以写回更改的方法,UnionFS可能是您要寻找的。它提供了将只读和可读写位置合并为一的手段。
Unionfs允许任何只读和可读写分支的混合,以及在扇出中的任何位置插入和删除分支。
最初我要推荐这个(我经常使用它):
假设权限不是问题(例如仅需要读取),我建议将它们绑定到指定位置。
mount -B <original> <new-location>
# or
mount --bind <original> <new-location>
<新位置>必须存在于一个文件夹中。

谢谢您的建议!我尝试了挂载绑定,并成功创建了一个新的挂载点。但是:1)我有成千上万个目录,这将需要成千上万个挂载点;2)我在新目录中创建了一个文件,它也出现在原始目录中。 - Greg B
成千上万的目录,但没有一个可以使用的根目录?在这种情况下,您最多需要与用户数量相同的挂载点。即使不同的用户有单个共同根目录的不同子文件夹,挂载点的数量仍将等于用户数量。 - 0xC0000022L
可能存在重复的树形结构...但在操作系统级别上更改并不理想。我想我可以尝试递归地创建链接到原始文件和目录中的文件,并确保原始文件是只读的。 - Greg B
@GregB:但是在你的问题中,你也提到了你想要允许更改?我有点困惑。 - 0xC0000022L
理论上,我确实希望允许对目录中的任何内容进行更改。但是,如果我只能创建一个只读链接树的副本,即使它们只能添加,而不能修改现有文件,那也足够好了。 - Greg B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接