假设当我ls -li
在目录中执行操作时,我得到以下结果:
12353538 -rw-r--r-- 6 me me 1650 2013-01-10 16:33 fun.txt
如输出所示,文件乐趣.txt有6硬链接;索引节点号是12353538。
如何找到文件的所有硬链接(即具有相同 inode 号的文件)?
答案1
基本前提是使用:
find /mount/point -mount -samefile /mount/point/your/file
在系统上,findmnt
您可以像这样导出挂载点:
file=/path/to/your/file
find "$(findmnt -o TARGET -cenT "$file")" -mount -samefile "$file"
重要的是不要搜索/
- 除非目标文件位于该文件系统上 - 因为 inode 号在每个安装的文件系统中都会重复使用。
答案2
如果您已经有了 inode 编号,则可以使用 find 的-inum
选项:
find /mount/point -xdev -inum 12353538
(某些find
实现也支持-mount
作为等效项,-xdev
尽管只是-xdev
标准)。
答案3
ffind
从侦探套件可以找到某个inode的所有文件名,包括已删除的文件名。
例如:
sudo ffind -a /dev/sda3 $(stat --format=%i ~/just_a_test)
产量
* /home/me/empty_1
* /home/me/hard_link_to_empty1
/home/me/just_a_test
/home/me/hard_link_to_just_a_test
带有星号的条目是不再存在的旧文件名(因为该文件已被重命名或删除)。
我用来$(stat --format=%i ~/just_a_test)
获取文件的索引节点。
要以编程方式获取文件名的分区(/dev/sda3
在前面的示例中),您可以使用df
:
file=~/just_a_test; sudo ffind -a $(df -P "$file" | awk 'END{print $1}') $(stat --format=%i "$file")
答案4
感谢之前的回答。
请注意,stat
二进制文件不仅可以提供 inode,还可以提供其相应设备的挂载点。下面的代码片段使用它来解决“通常”用例:
fn_hardlinks() {
declare target; target="$1" && shift
[ ! -e "$target" ] && \
{ echo "[error] invalid target: '$target'" 1>&2; exit 1; }
stat '/' 2>/dev/null 1>&2 || \
{ echo "[error] no functioning 'stat' binary found'" 1>&2; exit 1; }
declare mount; mount="$(stat -c '%m' "$target")"
declare inode; inode="$(stat -c '%i' "$target")"
[ "x${mount[-1]}" != "x/" ] && mount+="/"
find "$mount" -xdev -inum "$inode" 2>/dev/null
}
alias hardlinks=fn_hardlinks
并运行:
> hardlinks ./resources/sphinx/gitinfo.py
/home/user/build/z-documentation/resources/sphinx/gitinfo.py
/home/user/build/sphinx-gitinfo/git/sphinx-gitinfo/gitinfo.py
PS:注意exit
vsreturn
取决于你如何使用它!