如何查找文件夹中的所有硬链接?

如何查找文件夹中的所有硬链接?

我有两个外部磁盘,里面有相同的文件。一个是加密的,另一个不是。加密磁盘的剩余空间比非加密磁盘少很多,我现在认为这是因为非加密磁盘上有硬链接。

所以我想检查加密磁盘上是否有可能重复的硬链接文件。我该如何识别硬链接?

如果您对可用空间问题的原因有任何其他想法,我很乐意听取您的意见。文件是否可能因为加密而需要更多空间?

答案1

$ find -type f -links +1

这将显示所有具有多个链接(名称)的常规文件。它不会告诉您哪些名称链接到同一个文件,为此您可以使用-samefile-inum,例如find -samefile "$somefile"

从技术角度来说,所有文件(文件名)都是(硬)链接,只有具有多个指向它们的链接的文件才具有这种意义。但即使在这些情况下,也无法说其中一个是“正确”的文件,而另一个是链接,链接是平等的。

举个例子:

$ touch a b c
$ ln b b2 ; ln c c2
$ find -type f -links +1
./c2
./b
./b2
./c
$ find -samefile b
./b
./b2

答案2

搜索硬链接

@ilkkachu 和 @barrycarter 的答案很好。这个答案是另一种选择,它更详细地描述了一些结果。

  • 如果链接的 {match is/matches are} 位于同一目录树中,您将直接找到它们。

  • 否则,您可以从挂载点搜索整个文件系统,但只能在同一个文件系统中使用-xdev,如果你搜索根分区,这一点很重要/并且还有其他已挂载的分区。

    $ sudo find / -xdev -type f -links +1 -ls | sort -n > hard-links-in-root.txt
    

下面是一个示例,在当前目录中找到一个硬链接对,并且通过从/media/multimed-2数据分区的挂载点搜索,在另一个目录中找到两个硬链接匹配。

$ sudo find . -xdev -type f -links +1 -ls | sort -n
  5242881    648 -rw-rw-r--   2 olle     nio        657936 jun 30  2015 ./like-this.png
  5242882    940 -rw-rw-r--   2 olle     nio        957688 jun 30  2015 ./from-here.png
 14843905   1620 -rw-r--r--   2 olle     nio       1652803 jun 30  2015 ./img_4810.jpg
 14843905   1620 -rw-r--r--   2 olle     nio       1652803 jun 30  2015 ./mid-sommer-night_4810.jpg

$ find /media/multimed-2/ -samefile ./like-this.png
/media/multimed-2/Photos/2015/06/30/like-this.png
/media/multimed-2/Bilder/kartor/like-this.png

$ find /media/multimed-2/ -samefile ./from-here.png
/media/multimed-2/Photos/2015/06/30/from-here.png
/media/multimed-2/Bilder/kartor/from-here.png

使用不同驱动器空间的其他原因

  • 不同的文件系统(ext4、NTFS、FAT32...)

  • 分区大小不同,导致开销(元数据)的差异。

  • 驱动器上的扇区大小不同(可能?)

答案3

理论上,硬链接应该与常规文件没有区别(这有点道理)。如果“x”是“y”的硬链接,那么“y”也是“x”的硬链接。话虽如此,第二列会ls -l告诉您指向给定文件的链接数。如果此数字大于 1,则表示该文件存在或某处有硬链接。这可能不适用于目录,但我不知道为什么。我最初说目录中的每个文件都有指向该目录的链接,但我错了:我发现一个目录有 10 个文件,其“链接数”只有 2。

一旦找到硬链接,您就可以ls -i查看其 inode,然后使用findinode 选项查找具有相同 inode 的其他文件(从而使它们相互硬链接)。 请务必限制find到特定设备,否则您可能会得到虚假结果。

要一次找到所有硬链接,请find吐出设备上所有文件的 inode,然后使用sort和之类的东西uniq来查找重复项。

答案4

你可以做这样的事情:

find . -type t -ls | grep -v " 1 username"

这将列出当前目录中的文件并对其执行ls。正如@barrycarter所说,硬链接与真实文件没有区别,但在此列表中,它们将显示为具有多个链接。使用grep -v您将剔除只有一个链接的文件。(usernamegrep 命令中的是让 grep 在正确的位置查找单个1。用您自己的用户名替换。)

相关内容