You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Fish shell中如何判断两个路径是否指向同一文件或目录?

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

要判断两个路径(即使字符串不同)是否指向同一个文件或目录,不能直接用字符串比较或test "$path1" -eq "$path2"(-eq仅用于整数比较,对路径完全无效),可以用以下两种可靠方法:

方法1:用realpath规范化路径后比较

realpath会将相对路径、带符号链接的路径解析为绝对、无冗余的标准路径,之后直接比较字符串即可:

path1="./"
path2="../foobar/"

# 先检查路径是否存在
if [ ! -e "$path1" ] || [ ! -e "$path2" ]; then
    echo "错误:至少一个路径不存在"
    exit 1
fi

# 规范化路径并比较
if [ "$(realpath "$path1")" = "$(realpath "$path2")" ]; then
    echo "两个路径指向同一位置"
else
    echo "两个路径指向不同位置"
fi

方法2:用stat比较文件的设备号和inode号

同一文件系统中,每个文件/目录的**设备号(%d)和inode号(%i)**组合是唯一的,即使路径字符串不同,只要指向同一个对象,这两个值就会完全一致:

path1="./"
path2="../foobar/"

# 先检查路径是否存在
if [ ! -e "$path1" ] || [ ! -e "$path2" ]; then
    echo "错误:至少一个路径不存在"
    exit 1
fi

# 获取设备号+inode号并比较
stat_info1=$(stat -c "%d:%i" "$path1")
stat_info2=$(stat -c "%d:%i" "$path2")

if [ "$stat_info1" = "$stat_info2" ]; then
    echo "两个路径指向同一文件/目录"
else
    echo "两个路径指向不同位置"
fi

注意事项

  • 如果你的系统没有realpath(比如部分老旧Linux发行版),可以用readlink -f替代(readlink -f同样能解析相对路径和符号链接为绝对路径)。
  • 若路径指向符号链接,realpath会解析到链接的目标,而stat默认会获取符号链接本身的inode(如果要让stat解析符号链接目标,需加-L参数:stat -L -c "%d:%i" "$path")。

内容的提问来源于stack exchange,提问作者Flimm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:21:03