linux下查看某个文件或命令属于哪个包
查看某个文件属于哪个包
系统:centos/redhat
查询/usr/bin/ping对应的软件包 #yum provides /usr/bin/ping 或 #rpm -qf /usr/bin/ping
系统:ubuntu及衍生版
查询/usr/bin/nslookup对应的软件包 #dpkg -S /usr/bin/nslookup 或 #dpkg-query -S /usr/bin/nslookup
查询时或许有以下报错:
#dpkg -S 文件名 dpkg-query: no path found matching pattern
可能原因是:文件名是一个符号链接
比如需要查询 nc 的包名称:
#which nc /usr/bin/nc #dpkg -S /usr/bin/nc dpkg-query: no path found matching pattern /usr/bin/nc
其中 which nc 查询出来的是符号链接
解决办法:
方法1: 通过 ls 逐步找到对应的目标文件。
#which nc /usr/bin/nc #ll /usr/bin/nc lrwxrwxrwx 1 root root 20 Aug 22 2020 /usr/bin/nc -> /etc/alternatives/nc* #ll /etc/alternatives/nc lrwxrwxrwx 1 root root 15 Aug 22 2020 /etc/alternatives/nc -> /bin/nc.openbsd* #dpkg -S /bin/nc.openbsd netcat-openbsd: /bin/nc.openbsd
方法2: 通过 readlink 找到目标文件
但是直接使用有时也是会出现问题,比如:
#readlink -f $(which nc) /usr/bin/nc.openbsd #dpkg -S /usr/bin/nc.openbsd dpkg-query: no path found matching pattern /usr/bin/nc.openbsd
这是因为 /bin 是指向 /usr/bin/ 的符号链接。
#ll /bin lrwxrwxrwx 1 root root 7 Aug 28 2020 /bin -> usr/bin/
虽然有些文件是安装在于/bin 目录下,但是最终解析还是会解析到符号链接所指向的路径,即 /usr/bin 目录下。
因此,需要查询 /bin/nc.openbsd,而不是 /usr/bin/nc.openbsd
#dpkg -S /bin/nc.openbsd netcat-openbsd: /bin/nc.openbsd
查看某个命令属于哪个包
系统:centos/redhat
#yum provides 命令名
系统:ubuntu及衍生版
#aptitude install apt-file #apt-file update <---更新索引,查询之前必做
比如要查询mkdosfs所属的软件包
#apt-file search mkdosfs | egrep mkdosfs$ <---查找以mkdosfs结尾的文件,缩小搜索范围 dosfstools: /sbin/mkdosfs
该命令与dpkg -S的作用相似,不同的是dpkg -S只能查询系统已经安装过的,apt-file可以在软件源中进行查询