如何查找两个或多个目录中的任何文件是否存在硬链接?换句话说,两个或多个目录下的任何文件是否引用同一个文件?
如同如何查找给定文件的所有硬链接? [复制]和列出具有相同索引节点号的所有文件?。不过我想知道如何搜索任何硬链接文件不同目录之间。
答案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。