如何找到文件系统上的所有硬链接文件?


21

我需要找到给定文件系统上的所有硬链接文件。例如,获取文件列表,每行包含链接对或三元组等。

我或多或少了解如何做到这一点,需要为文件系统上的所有文件/目录创建一个由inode键控的字典。和“ ..”链接,然后有多个名称的indo就是硬链接……但是我希望可能存在一个现成的解决方案,或者有人已经编写了这样的脚本。

Answers:


17

您可以运行以下命令:

find / -type f -printf '%n %p\n' | awk '$1 > 1{$1="";print}'

查找所有硬链接的文件。

或@mbafford版本:

find / -type f -links +1 -printf '%i %n %p\n'

1
谢谢,这不是我想要的,但是足够接近。我可以添加'%i'来打印
索引

15
您可以通过使用find的“ -links + n”语法避免awk的需要。例如,查找具有至少两个链接的所有文件并打印出必要的信息:find / -type f -links +1 -printf '%i %n %p\n'
mbafford,2015年

如何通过sort(+ uniq)进行配管?我很好奇,所以在我的主计算机(16GB i5-2500k和ss​​d)上试了一下。find / -xdev -type f | wc返回3820个文件/ 570个inode(time sudo find / -xdev -type f -links +1 -printf "%i\n" | sort | uniq | wc)时,包含2187757个文件()的时间为12真正的秒。您需要%n %p将实际文件包括在内,因为我将它们取出来计数inode。
北部布雷德利

17
find . -type f -links +1 2>/dev/null

给出具有多个链接的所有文件的列表,即存在硬链接的文件。这样循环遍历就相对容易了–如果您没有那么多文件,这将是一个hacky解决方案

for i in $(find . -type f -links +1 2>/dev/null); do find -samefile $i | awk '{printf "%s ", $1}'; printf "\n"; done | sort | uniq

但我衷心希望有更好的解决方案,例如,让第一个find调用打印inode编号,然后使用find-inum选项显示与此inode关联的所有文件。


1
哎哟! 这一次又一次扫描每个硬链接文件的文件系统...
haimg 2012年

1
我并没有声称它是快速的,并且它对于小型目录树来说是可以的。当然,可以从的输出中构建适当的索引,这find . -type f -printf '%i %p\n'将使构建更快的解决方案成为可能。
克劳迪乌斯

而且这不能处理路径AFAIK中的空间。
Gilles Quenot 2012年

对于for循环,可以相应地调整IFS。为了在我的注释中解析find命令的输出,将第一个空格和行尾之间的所有内容都声明为文件名也应该起作用。
克劳迪乌斯2012年

1
@Sati:确保错误消息被丢弃(例如,对于您无法访问的文件夹lost+found等);如果应该像第二行中那样进一步处理输出,这一点尤其重要。
DJCrashdummy18年

1

恕我直言,最好的方法是使用以下行(确保您必须替换/PATH/FOR/SEARCH/为要搜索的内容):

find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' | fgrep -f <(find . -xdev -printf '%i\n' | sort -n | uniq -d) | sort -n

这仅扫描文件系统一次,显示inode,硬链接数和具有多个硬链接的文件的路径,并根据inode对其进行排序。

如果您被不允许阅读的文件夹的错误消息所困扰,则可以将行扩展为:

find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' 2> /dev/null | fgrep -f <(find . -xdev -printf '%i\n' 2> /dev/null | sort -n | uniq -d) | sort -n
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.