我怎样才能知道一个可执行文件来自哪个软件包?

我正在回答一个问题,并建议使用rename,但我意识到我不知道它来自哪个软件包(作为答案的一部分,我想说一些类似于“如果你没有rename,它是作为[软件包]的一部分安装的”)。 man rename告诉我SEE ALSO: mv(1), perl(1) - 所以我首先想到它是与perl一起安装的。
相关的答案,如何确定哪个软件包中包含了什么, 帮助我弄清楚perl软件包包括prename但不包括rename - 结果发现我的/usr/bin/rename指向/etc/alternatives/rename,而后者又指向/usr/bin/prename
所以这还有点令人困惑。在我安装perl之前,/etc/alternatives/rename指向其他地方吗?有没有一种通用的方法可以确定某个软件包来自哪里?

当然,所有这些答案只适用于作为(合适)软件包的一部分安装的软件 - 如果它是从源代码编译的或实际上由自定义安装程序安装的脚本组成,那就无法解决。 - Chris H
就此而言,相反的(可从软件包中执行)将是这个 - Pablo Bianchi
https://superuser.com/questions/10997/find-what-package-a-file-belongs-to-in-ubuntu-debian - sancho.s ReinstateMonicaCellio
4个回答

安装apt-file
$ sudo apt-get install apt-file

更新apt-file
$ sudo apt-file update

搜索文件所属的软件包
$ apt-file search filename

查找可执行文件的路径
$ whereis rename
rename: /usr/bin/rename.ul /usr/bin/rename /usr/bin/X11/rename.ul /usr/bin/X11/rename     /usr/share/man/man1/rename.1.gz /usr/share/man/man2/rename.2.gz

搜索套餐
$ apt-file search /usr/bin/rename
ladr4-apps: /usr/bin/renamer
util-linux: /usr/bin/rename.ul

包的名称是:util-linux

原來 dpkg-query 是一個很好的工具,可以獲取有關已安裝軟件包的信息,而使用 -S [pattern] 選項則可以搜索與 [pattern] 相對應的軟件包文件。
dpkg-query -S [filename-search-pattern]

2只需在Ubuntu 16.04上运行dpkg -S [二进制文件名]即可。 - waldyrious

截至2018年。
apt search filename

适用于最新的Ubuntu和大多数基于Debian的发行版。

2018年5月更新:显然不再与Ubuntu 18.04兼容。


2真的吗?在Ubuntu bionic中,似乎无法搜索文件名。$ apt search没有任何结果,而wajig which-package /bin/date则显示coreutils: /bin/date - nealmcb

您可以尝试使用 apt-file(它不是默认安装的一部分)。
0) 更新 apt-file 数据库 sudo apt-file update 1) 查找二进制文件
$ which rename
/usr/bin/rename

2) 找到包裹
$ apt-file search /usr/bin/rename
util-linux: /usr/bin/rename.ul

嘿,重命名是util-linux的一部分。

3穷人版的 apt-file:dpkg -S rename| grep -F $(which rename) - alexyorke