如何列出特定目录中包含文件的包?

如何列出特定目录中包含文件的包?

我正在从另一个发行版切换到 CentOS,而且我不习惯使用yum.我想知道是否有办法知道哪些已安装的软件包在目录中包含文件。

例如,我想知道哪些包中包含/usr/share/applications.

看看yum提供的内容,我看到有一种方法可以查看已安装的软件包(列出已安装的软件包),但即使提供也-q不能只得到软件包的名称。然而,我没有看到列出单个包的内容的选项。

是否可以?我怎样才能做到呢?

答案1

没有办法使用来做到这一点yum,但您可以制作一个rpm命令来完成您想要的大部分操作。您必须利用该--queryformat选项并使用[..].--queryformat

笔记:所有这些功能都在 RPM 手册中讨论,最大 RPM:将红帽软件包管理器发挥到极限

$ rpm -qa --queryformat '[%{NAME}: %{FILENAMES}\n]' | \
    sed 's#\(/.*/\).*$#\1#' | sort -u | grep '/usr/sbin' | head -10
abrt-addon-ccpp: /usr/sbin/
abrt-addon-pstoreoops: /usr/sbin/
abrt-addon-vmcore: /usr/sbin/
abrt-dbus: /usr/sbin/
abrt: /usr/sbin/
alsa-utils: /usr/sbin/
aoetools: /usr/sbin/
at: /usr/sbin/
authconfig: /usr/sbin/
avahi-autoipd: /usr/sbin/
...

细节

上面的代码通过符号--queryformat迭代数组宏,打印它们所包含的包的名称(),以及它们的完整安装路径。%{FILENAMES}[...]%{NAME}

例子
$ rpm -q --queryformat '[%{NAME}: %{FILENAMES}\n]' fatrace
fatrace: /usr/sbin/fatrace
fatrace: /usr/sbin/power-usage-report
fatrace: /usr/share/doc/fatrace-0.5
fatrace: /usr/share/doc/fatrace-0.5/COPYING
fatrace: /usr/share/doc/fatrace-0.5/NEWS
fatrace: /usr/share/man/man1/fatrace.1.gz

对于这种类型的输出,我们只需从上述路径中删除尾随文件名即可。为此我使用了sed.然后,我运行输出sort -u 以压缩任何重复的行,因为很多时候,许多包会将多个文件安装到一个目录中。最后,我用来grep ...查找给定目录中包含文件的包。为了进一步促进这一点,你可以这样做:

grep $(pwd)
例子
$ pwd
/usr/sbin

$ rpm -qa --queryformat '[%{NAME}: %{FILENAMES}\n]' | \
    sed 's#\(/.*/\).*$#\1#' | sort -u | grep $(pwd)

仅包含包名称的列表

要仅获取唯一列表中的包名称,您可以执行以下操作:

$ rpm -qa --queryformat '[%{NAME}: %{FILENAMES}\n]' | \
    sed 's#\(/.*/\).*$#\1#' | sort -u | grep $(pwd) | \
    awk -F: '{print $1}' | head -10
abrt-addon-ccpp
abrt-addon-pstoreoops
abrt-addon-vmcore
abrt-dbus
abrt
alsa-utils
aoetools
at
authconfig
avahi-autoipd

参考

答案2

我想知道哪些软件包在 /usr/share/applications 中有文件

您可以通过执行rpm -qf <absoluteFilePath>.要创建整个目录树,您可以使用该find命令并过滤输出。

例如:

[root@xxx01 ~]# find /usr/share/applications -type f -exec rpm -qf {} \; | grep -v "is not owned by any package" | sort | uniq 
firefox-31.1.0-5.el6_5.x86_64 
savui-1.0.14-13.i386 
shared-mime-info-0.70-4.el6.x86_64 
[root@xxx01 ~]#

然而,我没有看到列出单个包的内容的选项。

这是与 略有不同的选项rpm。例如列出firefox包中的文件:

[root@xxx01 ~]# rpm -ql firefox
/usr/bin/firefox
/usr/lib64/firefox
/usr/lib64/firefox/LICENSE
/usr/lib64/firefox/application.ini
/usr/lib64/firefox/browser/blocklist.xml
/usr/lib64/firefox/browser/chrome
/usr/lib64/firefox/browser/chrome.manifest
/usr/lib64/firefox/browser/chrome/icons
/usr/lib64/firefox/browser/chrome/icons/default
/usr/lib64/firefox/browser/chrome/icons/default/default16.png
/usr/lib64/firefox/browser/chrome/icons/default/default32.png
/usr/lib64/firefox/browser/chrome/icons/default/default48.png
/usr/lib64/firefox/browser/components
/usr/lib64/firefox/browser/components/components.manifest
/usr/lib64/firefox/browser/components/libbrowsercomps.so
/usr/lib64/firefox/browser/defaults/preferences
/usr/lib64/firefox/browser/extensions
/usr/lib64/firefox/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}
/usr/lib64/firefox/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/icon.png
/usr/lib64/firefox/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf
/usr/lib64/firefox/browser/icons
/usr/lib64/firefox/browser/icons/mozicon128.png
... snip ...

答案3

答案 slm 几乎是正确的,也许已经过时了。我拥有的最好的脚本如下:

rpm -qa --queryformat '[%{=NAME}: %{FILENAMES}\n]' | grep ' /var' |  cut -d: -f 1 | uniq

请注意,其实质内容几乎与上面的类似,“=”也使 NAME 成为迭代器。

答案4

看看是什么包提供您可以使用的特定文件或目录yum provides <file>

$ yum provides /usr/share/applications/*
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * fedora: mirrors.ircam.fr
 * rpmfusion-free-rawhide: mirrors.coreix.net
 * rpmfusion-nonfree-rawhide: mirrors.coreix.net
 * updates: ftp.uni-koeln.de
abrt-gui-2.3.0-3.fc21.x86_64 : abrt's gui
Repo        : fedora
Matched from:
Filename    : /usr/share/applications/abrt-applet.desktop



alacarte-3.11.91-2.fc21.noarch : Menu editor for the GNOME desktop
Repo        : fedora
Matched from:
Filename    : /usr/share/applications/alacarte.desktop

这种情况一直持续下去。通过管道将less其读取。

要列出包中的文件,只需使用rpm -ql <package>

$ rpm -ql less
/etc/profile.d/less.csh
/etc/profile.d/less.sh
/usr/bin/less
/usr/bin/lessecho
/usr/bin/lesskey
/usr/bin/lesspipe.sh
/usr/share/licenses/less
/usr/share/licenses/less/LICENSE
/usr/share/man/man1/less.1.gz
/usr/share/man/man1/lessecho.1.gz
/usr/share/man/man1/lesskey.1.gz

相关内容