查找传入的符号链接

查找传入的符号链接

在 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 -Norls -lpwd -P来模拟realpath,但这些方法比较困难。

另外,上面的示例无法正确处理包含空格的文件名。这是一个更好的方法。请注意,IFS=$'\n'需要bashzsh

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"

相关内容