查找两个目录之间的所有硬链接文件

查找两个目录之间的所有硬链接文件

如何查找两个或多个目录中的任何文件是否存在硬链接?换句话说,两个或多个目录下的任何文件是否引用同一个文件?

如同如何查找给定文件的所有硬链接? [复制]列出具有相同索引节点号的所有文件?。不过我想知道如何搜索任何硬链接文件不同目录之间

答案1

您可以find列出目录中具有超过 1 个链接的所有文件的 inode 编号,然后对结果进行排序并提取同一 inode 多次出现的行。

这些目录应该位于同一文件系统上:

find dir1 dir2 ... -xdev -type f -links +1 -printf '%i %p\n' |
sort -n -k1,1 |
awk '{   same = ($1==last)
         if(!same)save = $0
         else{ if(save!=""){ print save; save = "" }
                print 
         }
         last = $1
}'

此代码打印文件及其索引节点。

108743 /tmp/a1
108743 /tmp/a2-hardlink-to-a1

如果find不可用,则使用ls -i1.

答案2

find命令应打印目录下./b链接到目录下文件的所有文件./a

find ./a -type f -exec find ./b -samefile {} -printf "%p hard link to {}" \;

给定文件路径和索引节点号的示例

$ find -type f -printf '%p:%i\n' | sort | column -t -s:
./a/f  12977541
./b/f  12977577  # unique file
./c/f  12977541  # points to same file as path ./a/f
#file  inode

对目录运行 find 命令./a./b查找目录下的任何硬链接文件./c

 $ find ./a ./b -type f -exec find ./c -samefile {} -printf "%p hard link to {}" \;
 ./c/f hard link to ./a/f


这是一O(n^2)手术。由于文件数量很大,这将需要很长时间!

使用GNU 查找 4.4.2,linux 3.13.0-85,乌班图14.04

相关内容