创建整个文件夹的递归硬链接

Raz*_*ail 4 linux hardlink links

首先,我知道您无法创建文件夹的硬链接。

我想知道是否有任何命令(linux)可以自动(递归地)在目的地创建后续文件夹树,然后自动将所有文件从源硬链接到目的地。

Del*_*tik 7

绑定安装是更好的解决方案吗?它完全符合您的要求,即让两个不同路径上的所有文件递归地相同。

此命令使/other内容与现有挂载或目录相同/original

mount --bind /original /other
Run Code Online (Sandbox Code Playgroud)

/original您在其中一个或中所做的任何更改/other都会立即显示在另一个中,因为这两个路径现在指向同一安装。

  • 谢谢,但我需要硬链接才能在主机系统和我的 docker 容器上工作。 mount--bind 文件夹的内容不会显示在容器内 (2认同)
  • @RazorHail:听起来您没有正确配置 Docker 容器安装。 [Docker 绑定挂载](https://docs.docker.com/storage/bind-mounts/) 将主机挂载到容器中。如果您的问题与 Docker 有关,您应该在问题中说明这一点,并提供有关如何设置或想要设置容器存储的详细信息。 (2认同)

Kam*_*ski 5

我不确定“然后自动将所有文件从源硬链接到目标”是什么意思。而且你明确想要递归。

\n

如果您希望这两个位置保持“同步”,因此应同时在两个位置中观察到删除或创建文件,那么绑定安装(另一个答案)就很好。请注意,该解决方案不会在文件系统中留下任何痕迹。如果您创建硬链接,它将在文件系统中创建。移动磁盘并将文件系统挂载到另一个操作系统中,硬链接仍然存在。重新启动,硬链接仍然存在。绑定安装位于操作系统级别。在移动和挂载磁盘后,您不仅需要单独命令其他操作系统进行绑定挂载。如果您不移动磁盘,您仍然需要告诉当前操作系统在重新启动后再次绑定挂载(如果您想要永久解决方案)。

\n

目录的符号链接有点类似,它存在于文件系统中。

\n
ln -s /original /other\n
Run Code Online (Sandbox Code Playgroud)\n

如果符号链接及其目标属于同一文件系统并且符号链接是相对的,那么即使文件系统安装在其他地方(不同的安装点,可能在不同的操作系统中),它也会工作。有一些原因导致符号链接可能不是您想要的(示例)。

\n

注意绑定安装或符号链接并不是真正的递归。这是“连接”两条路径的单一行为。它对更深的路径没有任何作用。它们的(半)等价性是因为各个((((\xe2\x80\xa6)great-)great-)grand)父“目录”之间存在某种链接。

\n

现在,如果“然后自动将所有文件从源硬链接到目标”的意思是“自动执行此操作一次”,那么您可以使用以下命令来执行此操作cp

\n
cp -lR /original /other\n
Run Code Online (Sandbox Code Playgroud)\n

-l尽管 POSIX 并不要求)。它就像cp -R但带有硬链接。这确实是递归的。但这也是一次性的行动。目录子树是独立的,只有常规文件出现硬链接。文件创建或删除不会被镜像。破坏硬链接的操作将会破坏硬链接。

\n