在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
相关产品推荐
相关产品推荐

