我可以使用以下命令打印目录中文件的硬链接数量find . type f -printf "%f %n\n"
,但这不仅会打印原始文件的硬链接:
示例:file1 是原始文件。 hardlink1 是原始 file1 的硬链接。
使用此代码它将打印以下内容:
file1 2 hardlink1 2
我希望这个问题只能通过使用来解决find
。我只想打印原始文件。
答案1
您误解了硬链接的工作原理。没有原件。全部文件只是硬链接到索引节点。因此,硬链接实际上并不链接到文件,而是链接到 inode。
为了说明这一点,请考虑以下文件:
$ touch file
$ ls -li file
3282140 -rw-r--r-- 1 terdon terdon 0 May 3 16:27 file
正如您在上面看到的,file
指向 inode 3282140
。现在,如果我们创建一个到它的软链接:
$ ln -s file softlink
$ ls -li
3282140 -rw-r--r-- 1 terdon terdon 0 May 3 16:27 file
3282141 lrwxrwxrwx 1 terdon terdon 4 May 3 16:29 softlink -> file
软链接指向file
但链接本身(也是文件系统对象,另一个“文件”)具有不同的 inode ( 3282141
)。但是,如果我们创建硬链接,它将共享相同的索引节点:
$ ln file hardlink
$ ls -li
total 0
3282140 -rw-r--r-- 2 terdon terdon 0 May 3 16:27 file
3282140 -rw-r--r-- 2 terdon terdon 0 May 3 16:27 hardlink
3282141 lrwxrwxrwx 1 terdon terdon 4 May 3 16:29 softlink -> file
因此,如果我现在向 中添加一些文本hardlink
,则与向自身添加文本完全相同file
:
$ echo "foo" > hardlink
$ cat hardlink
foo
$ cat file
foo
并且,由于softlink
指向,我将看到if I itfile
的内容:file
cat
$ cat softlink
foo
file
如果我向、中添加文本,hardlink
也会发生同样的情况file
:
$ echo bar >> file
$ cat hardlink
foo
bar
现在,如果我删除file
,softlink
将是一个损坏的链接,但hardlink
不会受到影响:
$ rm file
$ ls -li
total 4
3282140 -rw-r--r-- 1 terdon terdon 8 May 3 16:33 hardlink
3282141 lrwxrwxrwx 1 terdon terdon 4 May 3 16:29 softlink -> file
$ cat softlink
cat: softlink: No such file or directory
由于链接的目标已被删除,因此软链接已损坏。然而,硬链接仍然存在,因为它指向同一个 inode:
$ cat hardlink
foo
bar
所有这一切都是说,根本没有办法区分硬链接和它创建时指向的文件,因为与软链接不同,它实际上并不是创建指向文件的。所有文件都是指向文件系统索引节点的硬链接。事实上,删除文件只是删除了索引节点的链接。它实际上并没有删除数据。系统会记录指向每个 inode 的链接计数,如果链接计数为 0,则简单地认为 inode 可供写入。
您可以做的是找到所有指向某个 inode 的链接并删除除一个之外的所有链接。如果我们回到一开始的地方:
$ rm *
$ touch file
$ ln file hardlink
$ ls -l file hardlink
-rw-r--r-- 2 terdon terdon 0 May 3 16:39 file
-rw-r--r-- 2 terdon terdon 0 May 3 16:39 hardlink
^
|---- the number of links
的输出ls -l
包括指向索引节点的链接数。因此,您可以迭代其输出(这是解析ls
安全的少数情况之一)并删除链接号> 1的任何文件:
for file in *; do [ $(ls -l $file | cut -d' ' -f2) -gt 1 ] && rm "$file"; done
只要所有硬链接都位于同一目录中,这就会删除除一个之外的所有硬链接。
进一步阅读:http://teaching.idallen.com/dat2330/04f/notes/links_and_inodes.html