使用“mv”跨文件系统移动硬链接文件时会发生什么?

使用“mv”跨文件系统移动硬链接文件时会发生什么?

我在一个文件系统上有一个文件夹集合,它们被硬链接在一起(内容相同)。

当我将其中一个文件夹移动到另一个磁盘上的另一个文件系统时会发生什么?

我在 Mac OSX snow leopard 上并且正在使用命令行mv命令。

答案1

mv不,默认不是保留硬链接:

~$ 哪个 mv
/bin/mv
~$ uname -a
Darwin mini.local 13.4.0 Darwin 内核版本 13.4.0:2014 年 8 月 17 日星期日 19:50:11 PDT;root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64

~$ cd /卷/备份\ 主/
备份主目录 $ mkdir test
备份主要 $ cd 测试/
测试$ echo foo> a
测试$ln ab
测试$ ls -li ab
14271856 -rw-r--r-- 2 用户工作人员 4 十月 15 19:23
14271856 -rw-r--r-- 2 用户工作人员 4 十月 15 19:23 b
测试$ cd..
备份主服务器$ mv test ../Backup\ secondary/
备份主服务器$ ls -li ../Backup\ secondary/test/
共 32
11040478 -rw-r--r-- 1 用户工作人员 4 十月 15 19:23
11040479 -rw-r--r-- 1 用户工作人员 4 十月 15 19:23 b

答案2

笔记

一个文件系统上已硬链接在一起的文件夹

通常在Unix中不支持将目录硬链接在一起。我假设您的意思是“一个目录中的文件是另一个目录中文件的硬链接”。


mv行为

假设您有许多彼此硬链接的文件,即许多路径指向文件系统内存储一次的相同数据。

比较这个 Unix 和 Linux SE 答案.相关部分:

文件系统之间的移动(无论是否在同一物理介质上)都被视为文件复制,然后删除。事实上,这正是该mv命令所做的。显然,这意味着目标文件系统必须制作该文件的新副本。

复制完成后,mv类似地删除源rm适用:

rm只是删除指针。如果您有多个指向该文件的指针(硬链接),则删除其中一个指针rm不会影响其他指针,数据仍然可用。

因此,如果你将一些硬链接文件移动到另一个文件系统,其他硬链接将是安全的。硬链接不能跨文件系统,因此新副本不能是源文件系统上剩余的任何内容的硬链接。

如果您移动所有硬链接文件,它们都将从源文件系统中消失并出现在目标文件系统中。请注意,即使单个mv(移动多个文件)会分别创建每个新文件,它们也会不再相互硬链接。理论上mv可以执行一些额外的工作来检测硬链接并在目标文件系统中重新创建它们,但实际上并没有(如图所示这是另一个答案)。


移动硬链接以获取硬链接

还有其他工具可以重新创建硬链接,tar这是其中之一(虽然我不能确定tar在 Mac OS X 上是否确实如此)。比较

默认情况下,如果您指定tar使用硬链接来存档文件,并且要存档的文件中包括多个此类链接,则它只会存档文件一次,并将第二个(以及任何其他名称)记录为硬链接。这意味着当您提取该存档时,硬链接将被恢复。

请注意,恢复的文件之间将恢复硬链接(即,它们将模仿源的硬链接连接),但恢复的文件永远不会重新硬链接到源文件(或它们的硬链接可能仍然存在),即使它们被提取到tar从中获得它们的同一文件系统。

为了充分利用此功能而tar无需创建大型档案,您需要一些 shell 技巧。例如:

tar -c /source/dirA/ /source/file1  | { cd /foo/destination/ && tar -x; }

该命令执行复制但不删除。如果您需要删除源,请最终使用单独的命令执行此操作。

相关内容