「如何查找某个文件所属的软件包」

内容:如果获取命令所属的软件包及如何找到命令的完整手册。

此文并无任何技术含量,只是有些时候:

  • 我们不知道去哪里找到一个命令的完整手册。很显然这里不是要介绍 man 命令,man 命令显示的只是命令的速记手册,而且有些并没有非常详细的解释命令。
  • 当出现command no found或库文件不存在的时候,我们不知道这个命令或库属于哪个软件包,不知道该安装什么。

要想找到命令的完整手册,肯定是官方的文档。本文的主要目的:

  • 如何找到命令所属的软件包。
  • 告诉大家如何找到命令的官方文档。

下面分别以 Debian 和 CentOS 为例:

在「Debain及其衍生版」中

使用apt-file命令

Debian 为例,比如我要查找ifconfig命令所属的软件包。
这里要用到另外一个软件包apt-file,先安装:

#!/bin/sh

# 安装
apt-get install apt-file

# 更新。视情况而定,跳过也可以。如果有必要更新 apt-file 会提示你
apt-get upadte

# 此命令用于生成软件包中文件缓存列表。
apt-file upate

然后,执行查找。查找 ifconfig 所属的软件包:

#!/bin/sh

apt-file search ifconfig | grep -E '/ifconfig$'
# 输出:net-tools: /sbin/ifconfig
# 结论:这个命令属于net-tools软件包。

#
# apt-file update 会生成缓存,缓存的内容是所有软件包中的所有命令的索引,类似如下内容:
# ......
# adwaita-icon-theme: /usr/share/icons/Adwaita/48x48/actions/edit-find-replace.png
# adwaita-icon-theme: /usr/share/icons/Adwaita/48x48/actions/edit-find.png
# adwaita-icon-theme: /usr/share/icons/Adwaita/scalable/actions/edit-find-symbolic.svg
# adwaita-icon-theme: /usr/share/icons/Adwaita/scalable/actions/find-location-symbolic.svg
# aegis: /usr/bin/aefind
# aegis: /usr/share/man/man1/aefind.1.gz
# aeskeyfind: /usr/bin/aeskeyfind
# aeskeyfind: /usr/share/doc/aeskeyfind/README
# aeskeyfind: /usr/share/doc/aeskeyfind/changelog.Debian.gz
# aeskeyfind: /usr/share/doc/aeskeyfind/copyright
# aeskeyfind: /usr/share/man/man1/aeskeyfind.1.gz
# afterstep-data: /usr/share/afterstep/applications/find.desktop
# agtl: /usr/share/pyshared/advancedcaching/coordfinder.py
# aide-common: /usr/share/aide/config/aide/aide.conf.d/31_aide_findutils
# allegro4-doc: /usr/share/man/man3/al_findclose.3alleg4.gz
# allegro4-doc: /usr/share/man/man3/al_findfirst.3alleg4.gz
# ......
#

#
# 当你执行 apt-file search aeskeyfind 时,会匹配到如下内容:
# aeskeyfind: /usr/bin/aeskeyfind
# aeskeyfind: /usr/share/doc/aeskeyfind/README
# aeskeyfind: /usr/share/doc/aeskeyfind/changelog.Debian.gz
# aeskeyfind: /usr/share/doc/aeskeyfind/copyright
# aeskeyfind: /usr/share/man/man1/aeskeyfind.1.gz
#

#
# 所以你需要 grep 来过滤。
#

#
# 命令解释:apt-file search ifconfig ,用于搜索包含 ifconfig 这个字符串的所有文件或文件夹(文件或目录都是绝对路径的,如上所示),而
# grep -E '/ifconfig$' 用于缩小范围。因为是绝对路径,所以我们想要的 ifconfig 前面一定会有一个斜线,并且我们想要搜索的一定是以 ifconfig 为结尾,所以有个$符号。
#

在「CentOS」或「Red Hat」中

下面以 CentOS 为例子,比如我要查找 ifconfig 命令所属的软件包:

1). CentOS 下比较直接,用 yum 命令就可以了:

#!/bin/sh

yum provides ifconfig

# 输出:
#
# Loaded plugins: fastestmirror
# Loading mirror speeds from cached hostfile
#  * base: mirrors.163.com
#  * extras: mirrors.163.com
#  * updates: mirrors.163.com
# net-tools-1.60-110.el6_2.x86_64 : Basic networking tools
# Repo        : base
# Matched from:
# Filename    : /sbin/ifconfig
#
# net-tools-1.60-110.el6_2.x86_64 : Basic networking tools
# Repo        : installed
# Matched from:
# Filename    : /sbin/ifconfig
#

#结论: 属于net-tools-1.60-110.el6_2.x86_64 软件包

2). 获取软件包的详细信息:

#!/bin/sh

yum info net-tools-1.60-110.el6_2.x86_64

# 输出
#
# Loaded plugins: fastestmirror
# Loading mirror speeds from cached hostfile
#  * base: mirrors.163.com
#  * extras: mirrors.163.com
#  * updates: mirrors.163.com
# Installed Packages
# Name        : net-tools
# Arch        : x86_64
# Version     : 1.60
# Release     : 110.el6_2
# Size        : 760 k
# Repo        : installed
# From repo   : anaconda-CentOS-201605220104.x86_64
# Summary     : Basic networking tools
# URL         : http://net-tools.berlios.de/
# License     : GPL+
# Description : The net-tools package contains basic networking tools,
#             : including ifconfig, netstat, route, and others.
#             : Most of them are obsolete. For replacement check iproute package.
#

# 看见URL了么,那就是官网地址。http://net-tools.berlios.de/