Como listar pacotes com arquivos em um diretório específico?

2

Estou mudando para o CentOS de outra distribuição e não estou acostumado a trabalhar com yum . Gostaria de saber se existe uma maneira de saber quais pacotes instalados têm arquivos em um diretório.

Por exemplo, eu gostaria de saber quais pacotes têm arquivos dentro de /usr/share/applications .

Olhando para o que o yum fornece, vi que existe uma maneira de ver os pacotes instalados (lista instalada), mas mesmo fornecendo -q , não consigo apenas os nomes dos pacotes. Eu não vi nenhuma opção para listar o conteúdo de um único pacote, no entanto.

É possível? Como eu pude fazer isso?

    
por Carlos 19.11.2014 / 18:19

4 respostas

2

Não há uma maneira de fazer isso usando yum , mas você pode criar um comando rpm que fará basicamente o que você deseja. Você terá que utilizar a opção --queryformat e percorrer a matriz de nomes de arquivos usando a opção pouco conhecida [..] no --queryformat .

NOTA: Todos esses recursos são discutidos no manual de RPM, RPM Máxima: Tomando o Vermelho Gestor de Pacotes do Hat ao Limite .

$ rpm -qa --queryformat '[%{NAME}: %{FILENAMES}\n]' | \
    sed 's#\(/.*/\).*$##' | 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/
...

Detalhes

O --queryformat acima itera sobre a macro da matriz %{FILENAMES} por meio da notação [...] , imprimindo o nome ( %{NAME} ) do pacote em que estão contidos, junto com o caminho completo instalado.

Exemplo
$ 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

Com este tipo de saída, simplesmente precisamos cortar os nomes de arquivos à direita dos caminhos acima. Para isso usei sed . Em seguida, executo a saída por meio de sort -u para condensar quaisquer linhas duplicadas, pois, muitas vezes, muitos pacotes instalam uma grande quantidade de arquivos em um único diretório. Finalmente eu uso grep ... para encontrar os pacotes que possuem arquivos em um determinado diretório. Para facilitar isso, você pode fazer isso:

grep $(pwd)
Exemplo
$ pwd
/usr/sbin

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

Uma lista de apenas nomes de pacotes

Para obter apenas os nomes dos pacotes em uma lista única, você pode fazer o seguinte:

$ rpm -qa --queryformat '[%{NAME}: %{FILENAMES}\n]' | \
    sed 's#\(/.*/\).*$##' | 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

Referências

por 19.11.2014 / 19:23
1

I'd like to know which packages have files within /usr/share/applications

Você pode consultar qual pacote possui um arquivo específico fazendo um rpm -qf <absoluteFilePath> . Para fazer uma árvore de diretórios inteira, você pode usar o comando find e filtrar a saída.

Por exemplo:

[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 ~]#

I saw no option to list contents of a single package however.

Esta é uma opção ligeiramente diferente com rpm . Por exemplo, para listar quais arquivos estão no pacote 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 ...
    
por 19.11.2014 / 18:51
0

Para ver qual pacote fornece um arquivo ou diretório específico, você pode usar 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

e continua e continua. Pipe para less para ler.

Para listar os arquivos em um pacote, basta usar 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
    
por 19.11.2014 / 22:20
0

A resposta slm está quase certa, talvez esteja desatualizada. O melhor roteiro que tenho é o seguinte:

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

Observa que a carne é quase igual à anterior, o '=' também faz do NAME um iterador.

    
por 31.03.2018 / 06:02