在Bash中检查两条路径是否相等的最佳方法是什么?例如,给定目录结构
~/
Desktop/
Downloads/ (symlink to ~/Downloads)
Downloads/
photo.png
假设当前目录是主目录,则以下所有内容都是等效的:
./ and ~
~/Desktop and /home/you/Desktop
./Downloads and ~/Desktop/Downloads
./Downloads/photo.png and ~/Downloads/photo.png
有没有一个原生的Bash方法可以做到这一点?
5条答案
按热度按时间zfycwa2u1#
Bash的
test
命令有一个-ef
操作符用于此目的:以下是此操作符的文档:
请注意,操作符的两个路径都必须引用现有的文件或目录才能正常工作。如果文件或目录不存在,测试将返回false。
如果你愿意,你可以在这种情况下使用双括号而不是单括号:
fjnneemd2#
可以使用
realpath
。举例来说:再看看类似的答案:bash/fish command to print absolute path to a file
bvn4nwqk3#
原生bash方式:
pwd -P
返回物理目录,而不考虑符号链接。另一种方法是使用
cd -P
,它将遵循符号链接,但将您留在物理目录中:2lpgd9684#
如果您安装了coreutils 8.15或更高版本,则可以使用
realpath
命令完全规范化路径。它删除所有.
和..
组件,使路径成为绝对路径,并解析所有符号链接。由此可见:u5rb5r595#
当涉及其他因素时,基于解析符号链接的方法会失败。例如,绑定挂载。(如
mount --bind /raid0/var-cache /var/cache
使用
find -samefile
是一个很好的选择。这将比较文件系统和inode号。-samefile
是一个GNU扩展。即使在Linux上,busybox find也可能没有它。GNU用户空间和Linux内核通常是一起的,但是你可以有一个而没有另一个,这个问题只标记为Linux和bash。例如,在我的系统中:
如果您希望在最终路径组件中遵循符号链接,则可以使用
find -L
:显然,这适用于指向目录或任何类型的文件的路径,而不仅仅是普通文件。它们都有inode编号。
使用方法:
因此
find -L
取消了-samefile
和路径列表的符号链接引用。因此,其中一个或两个都可以是符号链接。