如何从命令行判断两个文件是否硬链接?例如链接这个的东西:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
答案1
在大多数文件系统上,一个文件是由它的唯一确定的索引节点号,因此您需要检查的是两个文件是否具有相同的 inode 号并且位于同一文件系统上。
Ash、ksh、bash 和 zsh 有一个可以为您进行检查的构造:文件相等运算符-ef
。
[ fileA -ef fileB ] && ! [ fileA -ef fileC ]
对于更高级的情况,ls -i /path/to/file
列出文件的索引节点号。df -P /path/to/file
显示文件所在的文件系统(如果两个文件位于同一目录中,则它们位于同一文件系统上)。如果您的系统有该stat
命令,它可能会显示索引节点和文件系统编号(stat
因系统而异,请检查您的文档)。如果您想快速浏览目录内的硬链接,请尝试ls -i | sort
(可能通过管道传输到 awk)。
1 所有本机 unix 文件系统,以及其他一些文件系统(例如 NTFS),但可能不是像 CramFS 这样的特殊情况。
答案2
function is-hardlinked() {
r=yes
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
echo $r
}
答案3
正如第一个海报所建议的,您可以在 Linux 上编写基于类似以下内容的脚本:
stat -c '%i' fileA fileB fileC
答案4
您可以使用内置的 bash 运算符非常简单地完成此操作-ef
:
[[ file1 -ef file2 ]] && echo Same
如果条件计算结果为真(file1
并且file2
相同),则打印“相同”。否则,不会输出任何内容。