两个文件是否硬链接?

两个文件是否硬链接?

如何从命令行判断两个文件是否硬链接?例如链接这个的东西:

$ 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相同),则打印“相同”。否则,不会输出任何内容。

相关内容