Answers:
您可以运行以下命令:
find / -type f -printf '%n %p\n' | awk '$1 > 1{$1="";print}'
查找所有硬链接的文件。
或@mbafford版本:
find / -type f -links +1 -printf '%i %n %p\n'
find / -type f -links +1 -printf '%i %n %p\n'
sort
(+ uniq
)进行配管?我很好奇,所以在我的主计算机(16GB i5-2500k和ssd)上试了一下。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。
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关联的所有文件。
find . -type f -printf '%i %p\n'
将使构建更快的解决方案成为可能。
for
循环,可以相应地调整IFS。为了在我的注释中解析find命令的输出,将第一个空格和行尾之间的所有内容都声明为文件名也应该起作用。
lost+found
等);如果应该像第二行中那样进一步处理输出,这一点尤其重要。
恕我直言,最好的方法是使用以下行(确保您必须替换/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