如果由于命令是符号链接而“dpkg -S”找不到路径,如何查找安装命令的包?

如果由于命令是符号链接而“dpkg -S”找不到路径,如何查找安装命令的包?

当我为以下内容编写标签信息时,我试图查找哪个包rename命令已安装。我跑了通常的dpkg -S(也提到了这个问题):

$ which rename
/usr/bin/rename
$ dpkg -S $(!!)
dpkg-query: no path found matching pattern /usr/bin/rename

我通常不会手动安装命令/usr/bin,并且在我有权访问的其他计算机上rename也安装了命令。我的第一个怀疑是这个命令是在某些软件包的安装后步骤中复制的。

然后我做了一个ls -l /usr/bin/rename,发现该rename命令确实是一个链接。我尝试了dpkg -S链接目标(/etc/alternatives/rename),但dpkg -S /etc/alternatives/rename也没有给出包名称。

经过进一步搜索,我发现该链接链的真正可执行目标是/usr/bin/prename并且有一个dpkg -S关于不遵循符号链接行为的错误报告。该报告来自 2003 年,我找不到任何跟踪符号链接的选项dpkg,而且该问题似乎不太可能得到解决。

如果命令是符号链接,如何轻松找到包含“真实”可执行文件的包?

答案1

您可以使用readlink打印链接指向的位置。 without options 的参数readlink必须是一个链接,如果你向它传递一个文件,它不会打印任何内容。coreutils 包中的-f选项递归地跟踪链接readlink即使参数已经是文件,也会打印文件名。

如果您这样做(-n抑制输出末尾的换行符readlink):

dpkg -S "$(readlink -fn "$(which rename)")"

您将得到答案:

perl: /usr/bin/prename

在这种情况下,可以从 中清楚地看到所跟踪的链接prename,但不能保证情况一定如此(例如,如果链接指向rename不在 $PATH 中的目录中的可执行文件)。

正如 @011c 所示,如果您安装了它,您可以使用它realpath作为替代readlink -f

相关内容