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

l0b*_*0b0 13 linux symbolic-link

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

~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar
Run Code Online (Sandbox Code Playgroud)

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

编辑:D'oh,又经过几分钟的搜索揭示了答案readlink -f $path

Gil*_*il' 21

许多 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
Run Code Online (Sandbox Code Playgroud)

  • 根据我的联机帮助页, -ef 与 Rich Homolka 的回答完全相同。 (2认同)
  • @ user13852 `-ef` 的优点是更便携(也稍微快一点,但不是让你在大多数时候注意到)。例如,它适用于 *BSD、OSX、BusyBox 以及 Linux/Cygwin (GNU)。它也更清晰,因为它完全符合要求。我可以看到调用 `stat` 的唯一优势是当您不想遵循符号链接时。 (2认同)

Ric*_*lka 10

如果两个文件具有相同的 deviceID 和 inode,则它们是同一个文件。该stat命令行工具使这很容易找到,这个解决方案是壳POSIX兼容。

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
Run Code Online (Sandbox Code Playgroud)

-L每个中的标志stat意味着这适用于符号链接和硬链接文件。

  • 要跟踪符号链接,您需要 `stat -L`。 (6认同)