如何从命令行判断两个文件是否硬链接?例如一些链接:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
Run Code Online (Sandbox Code Playgroud)
Gil*_*il' 43
在大多数文件系统¹上,文件由其inode编号唯一确定,因此您需要检查的只是这两个文件是否具有相同的 inode 编号并位于同一文件系统上。
Ash、ksh、bash 和 zsh 有一个结构可以为您进行检查:文件相等运算符-ef。
[ fileA -ef fileB ] && ! [ fileA -ef fileC ]
Run Code Online (Sandbox Code Playgroud)
对于更高级的情况,ls -i /path/to/file列出文件的 inode 编号。df -P /path/to/file显示文件所在的文件系统(如果两个文件在同一目录中,则它们在同一文件系统上)。如果您的系统有该stat命令,它可能会显示 inode 和文件系统编号(stat因系统而异,请查看您的文档)。如果您想快速浏览目录中的硬链接,请尝试ls -i | sort(可能通过管道传输到 awk)。
¹ 所有原生 unix 文件系统,以及一些其他文件系统,例如 NTFS,但可能不是 CramFS 等特殊情况。
小智 5
function is-hardlinked() {
r=yes
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
echo $r
}
Run Code Online (Sandbox Code Playgroud)