打印带有硬链接数量的文件

打印带有硬链接数量的文件

我可以使用以下命令打印目录中文件的硬链接数量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的内容:filecat

$ 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

相关内容