假设我创建了一个硬链接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
如果在删除一个硬链接的同时也删除了另一个硬链接,那么您就犯了严重错误。在这种情况下使用rm
orrm -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 x
或rm -rf y
,另一个将留下。
答案3
链接是指向同一文件的新文件名。创建硬链接就是创建一个指向原文件inode的新目录项(文件名)。这就是为什么不能跨文件系统进行硬链接以及两个链接的元数据(权限、xattrs 等)相同的原因。在 Linux 上,创建硬链接只能是文件,而不是目录。
目录条目的数量通过 inode 中的链接计数来跟踪。创建硬链接时,链接计数会增加。删除文件时,目录条目将被删除,链接计数也会减少。您可以在ls -l
输出第二列中检查链接计数。删除单个目录条目(链接)不会删除其他目录条目。
如果您在包含目标文件的同一目录中创建了一个新的硬链接,那么rm -rf *
显然会删除这两个链接(如果链接计数变为 0,文件使用的空间将被文件系统回收)。