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

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

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

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

答案1

您可以运行以下命令:

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

查找所有硬链接文件。

或者@mbafford 版本:

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

答案2

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

给出所有具有多个链接的文件的列表,即存在硬链接的文件。循环执行这个操作相对容易——如果你没有那么多文件,那么一个不靠谱的解决方案是

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 关联的所有文件。

答案3

我认为最好的方法是使用以下行(当然您必须将其替换/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

相关内容