当我为以下内容编写标签信息时改名,我试图查找哪个包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