rm 硬链接而不删除文件/目录本身

rm 硬链接而不删除文件/目录本身

假设我创建了一个硬链接ln x y

创建链接后,有没有办法删除 y 处的链接而不删除 x 处的文件?看起来我rm -rf在 y 上做了 a,它也删除了 x,如果可能的话,希望避免这种情况,哈哈。

答案1

$ echo 'hello' >name
$ ln name othername
$ ls -l
total 4
-rw-r--r--  2 kk  wheel  6 Jun 25 09:45 name
-rw-r--r--  2 kk  wheel  6 Jun 25 09:45 othername
$ cat othername
hello
$ rm name
$ ls -l
total 2
-rw-r--r--  1 kk  wheel  6 Jun 25 09:45 othername
$ cat othername
hello

如果在删除一个硬链接的同时也删除了另一个硬链接,那么您就犯了严重错误。在这种情况下使用rmorrm -rf并不重要,删除哪个名称也不重要。

删除硬链接只会删除文件的名称之一。我认为rm -rf可以删除这两个名称的唯一方法是,如果您将其与匹配这两个名称的文件名 glob 一起使用,或者删除了包含这两个名称的目录。


从评论看来,您实际上正在使用一个为以下内容创建硬链接的应用程序:目录。在某些条件下,这在 macOS HFS+ 文件系统上是可能的。一般是真的处理硬链接目录非常繁琐,而且它们的使用很大程度上仅限于苹果自己的 TimeMachine 软件之类的东西。

相关的 Stackoverflow 问题:在 OS X 中创建目录硬链接的 Unix 命令是什么?

在该问题的答案中指出,需要使用unlink而不是删除硬链接目录,rm -r因为rm -r会删除该目录的内容(在其所有名称下)。

也可以看看:强制创建目录硬链接?

答案2

我知道这是一篇旧文章,但硬链接仅适用于文件,但您可以使用带有硬链接选项的复制来制作递归副本,它也可以在 Mac OS 中使用,尽管它会在 Mac 上发出警告消息,可以被忽略。

cp -Ral x y

代表-R递归,-a代表属性,-l代表链接。

之后,你可以rm -rf xrm -rf y,另一个将留下。

答案3

链接是指向同一文件的新文件名。创建硬链接就是创建一个指向原文件inode的新目录项(文件名)。这就是为什么不能跨文件系统进行硬链接以及两个链接的元数据(权限、xattrs 等)相同的原因。在 Linux 上,创建硬链接只能是文件,而不是目录。

目录条目的数量通过 inode 中的链接计数来跟踪。创建硬链接时,链接计数会增加。删除文件时,目录条目将被删除,链接计数也会减少。您可以在ls -l输出第二列中检查链接计数。删除单个目录条目(链接)不会删除其他目录条目。

如果您在包含目标文件的同一目录中创建了一个新的硬链接,那么rm -rf *显然会删除这两个链接(如果链接计数变为 0,文件使用的空间将被文件系统回收)。

相关内容