在 Linux 中,查找指向给定文件的所有符号链接的最佳方法是什么(无论符号链接是相对还是绝对)?我意识到这需要扫描整个文件系统。
答案1
GNUfind
有-samefile
测试。根据手册页:
-samefile name File refers to the same inode as name. When -L is in effect, this can include symbolic links.
$ find -L / -samefile /path/to/file
这将找到 的所有链接/path/to/file
,其中包括硬链接和文件本身。如果您只需要符号链接,您可以单独测试find
( )的结果test -L
。
您应该了解其影响,-L
并确保它不会给您的搜索带来任何问题。
注意:虽然文档说它会查找具有相同索引节点号的文件,但它似乎确实可以跨文件系统工作。
例如 /home 和 /tmp 是独立的文件系统
$ touch ~/testfile
$ ln -s ~/testfile /tmp/foo
$ ln -s /tmp/foo /tmp/bar
$ mkdir /tmp/x
$ ln -s ~/testfile /tmp/x/baz
$ find -L /tmp -samefile ~/testfile
/tmp/bar
/tmp/foo
/tmp/x/baz
请注意这是如何返回 /tmp/bar 的,它是 /tmp/foo 的符号链接,而 /tmp/foo 是 ~/testfile 的符号链接。如果您只想查找目标文件的直接符号链接,那么这是行不通的。
答案2
也许最短的方法是:
target="/usr/bin/firefox" # change me
dir="/usr/bin" # change me
realtarget="$(realpath "$target")"
for file in $(find "$dir" -print); do
realfile="$(realpath "$file")"
test "$realfile" = "$realtarget" && echo "$file"
done
但效率不是很高。
如果没有realpath
,请安装它,例如apt-get install realpath
。您还可以使用stat -N
orls -l
或pwd -P
来模拟realpath
,但这些方法比较困难。
另外,上面的示例无法正确处理包含空格的文件名。这是一个更好的方法。请注意,IFS=$'\n'
需要bash
或zsh
。
OIFS="$IFS"
IFS=$'\n'
target="/usr/bin/firefox" # change me
dir="/usr/bin" # change me
realtarget="$(realpath "$target")"
find "$dir" -print | while read -r file; do
realfile="$(realpath "$file")"
test "$realfile" = "$realtarget" && echo "$file"
done
IFS="$OIFS"