使用apt-file
我可以找到提供某些可执行文件的软件包,例如:
sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/wget
实际上:
sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/wget | grep "/wget$"
(因为否则它只会返回所有包含以wget
. 开头的可执行文件的包)
现在我正在跑步:
EXEC_NAME="x86_64-w64-mingw32-g++"
sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/${EXEC_NAME} | grep "${EXEC_NAME}$"
令人惊讶的是,它没有返回任何内容。为什么?因为没有包提供具有该名称的文件。
如果我运行:
EXEC_NAME="x86_64-w64-mingw32-g++"
sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/${EXEC_NAME}
我得到以下结果:
g++-mingw-w64-x86-64-posix: /usr/bin/x86_64-w64-mingw32-g++-posix
g++-mingw-w64-x86-64-win32: /usr/bin/x86_64-w64-mingw32-g++-win32
暗示没有提供包裹x86_64-w64-mingw32-g++
。
但过了一段时间,我发现它g++-mingw-w64-x86-64-posix
不仅提供了可执行文件g++-mingw-w64-x86-64-posix
,还提供了一个名为的别名或符号链接g++-mingw-w64-x86-64
。
在这种情况下,很容易弄清楚,因为该包恰好包含另一个名称非常相似的二进制文件。现在我的问题是,我需要以一种适用于任何别名/符号链接的方式自动执行此操作,即使对于名称完全不同的别名/符号链接也是如此。
我怎样才能做到这一点?
编辑:
g++-mingw-w64-x86-64-posix.postinst
别名是在包的文件中创建的g++-mingw-w64-x86-64-posix
,以防有帮助:
update-alternatives --install /usr/bin/x86_64-w64-mingw32-g++ x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix 30 \
--slave /usr/bin/x86_64-w64-mingw32-c++ x86_64-w64-mingw32-c++ /usr/bin/x86_64-w64-mingw32-c++-posix
编辑2:
有没有办法搜索所有包的文件内容.postinst
?也许可以通过将所有.postinst
文件下载到缓存中?也许可以先下载每个包的文件头,查看 .postinst 文件位于档案中的哪个字节,然后使用 HTTP 范围请求下载它们?
编辑3:
这不会改变任何东西,但我发现除了 grep 和 cut 之外,您还可以使用-x
和-l
标志。这会使命令更短一些:
sudo apt-file search -l -x "^/(bin|sbin|usr/bin|usr/sbin)/${EXEC_NAME}$" | head -1
答案1
如果你dwww
使用命令下载
sudo apt install dwww
您可以使用其子包之一 dwww-quickfind 来快速找到它。以下内容来自 dwww 手册页:
dwww-quickfind(8)
Used by dwww-find(8) to quickly find which package a program belongs to.
只是为了测试一下界面,从终端运行了 10 - 15 条命令,有些是 GNU,有些不是,没有问题。例如,当我运行
:~$ dwww-quickfind man
结果是
man-db
VIRTUAL: man-db
它显然会跟踪符号链接,所以我猜它也会跟踪别名。无论如何,它都值得一试。即使它没有,获得它也是dwww
值得的。输入dwww <any-pkg>
后你就会明白。
这就像是man
强化版的指令。
答案2
符号链接的问题在于它们不一定由包安装。
您可以使用readlink -f [/path/file]
它来(尝试)获取真实文件的路径。如果/path/file
是符号链接,readlink
则返回符号链接指向的文件。如果存在符号链接链,则将readlink
跟踪它们,直到到达链中的断点或真实文件。
然后您就可以使用apt-file
它来搜索包。