检查两个路径是否指向同一个文件

检查两个路径是否指向同一个文件

我有一个脚本,用于在我的主目录中递归创建指向我的设置目录的符号链接,以使文件处于版本控制之下。我希望它跳过已经通过父目录进行符号链接的文件。也就是说,如果我有这些文件/目录:

~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar

,我如何检查 ~/foo/bar 和 ~/settings/foo/bar 是否是同一个文件?

编辑: 哦,又搜索了几分钟,发现了回答readlink -f $path

答案1

如果两个文件具有相同的设备 ID 和 inode,则它们是同一个文件。stat命令行工具可以轻松找到这一点,并且此解决方案符合 POSIX shell 标准。

if [ "$(stat -L -c %d:%i FILE1)" = "$(stat -L -c %d:%i FILE2)" ]; then
  echo "FILE1 and FILE2 refer to a single file, with one inode, on one device."
else
  echo "no match"
fi

-L每个标志表示stat这适用于符号链接和硬链接文件。

答案2

许多 shell 都有一个-ef内置运算符test(或其同义词[),用于测试两条路径是否指向相同的现有文件(跟随符号链接)。这包括 bash、dash、pdksh、ksh88、ksh93 和 zsh,但不包括 POSIX sh。在 bash、ksh 或 zsh 中,您还可以在条件构造-ef中使用[[ … ]]

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files

答案3

对于软链接(使用 创建ln -s),您可以使用realpath。但这不适用于硬链接。

相关内容