基于解决符号链接的方法在存在其他因素时可能会失败。例如,绑定挂载(像mount --bind /raid0/var-cache /var/cache
)。
使用find -samefile
是一个不错的选择。这将比较文件系统和inode编号。
-samefile
是GNU的扩展。即使是在Linux上,busybox find可能也没有这个功能。GNU用户空间和Linux内核通常一起使用,但您可以单独使用其中任何一个,而此问题仅标记为Linux和bash。
samepath() {
[[ -s "$(find -L "$1" -samefile "$2")" ]]
}
例如,在我的系统上:
$ find /var/tmp/EXP/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb -samefile /var/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb
/var/tmp/EXP/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb
$ stat {/var/tmp/EXP,/var}/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb
File: ‘/var/tmp/EXP/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb’
...
Device: 97ch/2428d Inode: 2147747863 Links: 1
...
File: ‘/var/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb’
Device: 97ch/2428d Inode: 2147747863 Links: 1
你可以使用
find -L
,以便在最终路径组件中跟随符号链接:
$ ln -s /var/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb foo
$ find /var/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb -samefile foo
$ find -L /var/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb -samefile foo
/var/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb
显然,这适用于引用目录或任何类型的文件的路径,而不仅仅是常规文件。它们都有inode号。
用法:
$ samepath /var/cache/apt/ /var/tmp/EXP/cache/apt/ && echo true
true
$ ln -sf /var/cache/apt foobar
$ samepath foobar /var/tmp/EXP/cache/apt/ && echo true
true
samepath /var/tmp/EXP/cache/apt/ foobar && echo true
true
samepath foobar && echo true
find: `': No such file or directory
find -L
会为-samefile
和路径列表解除符号链接。因此,这两者都可以是符号链接。