Listar dependências opcionais com pacman no arch linux

23

Estou usando o arch linux.

Existe uma maneira de listar dependências opcionais de todos os pacotes instalados? E se sim, posso filtrar esta lista para ver apenas os pacotes ausentes (não instalados)?

vonPetrushev
fonte
1
Eu não usei o Arch, mas "dependência" não parece opcional (não está em outras distros).
Jordanm #
AFAIK, não acho que você possa fazer isso com pacman imediatamente. Mas é muito possível escrever um pequeno script para fazer isso. Consulte pacman para obter a lista de pacotes instalados. Faça com que Yaourt busque seus PKGBUILDs e leia a lista de optdeps. A versão mais recente do pacman-git possui um commit que indica se os optdeps já foram instalados.
darnir
@ Jordanm: Como tem construir dependências e dependências opcionais. Optdeps são necessários apenas para determinados recursos de um pacote. Portanto, a menos que você esteja usando esse recurso, você realmente não precisa inchar seu sistema com muitas cargas de dependência.
28512 darnir
Eu useipacman -Qi | grep "Optional Deps" | grep -v None | grep -v installed
stewSquared

Respostas:

5

Você pode usar expac para consultar o pacmanbanco de dados.

Algo como:

awk 'NF>=2' <(expac "%n %O") > optdeps

imprimirá uma lista de todos os pacotes instalados em sua máquina e o optdependsde cada ( %O) 1 em um arquivo chamado optdeps. Você pode classificar isso em uma lista de pacotes optdepends instalados.

Veja man expaca lista completa de opções.


1. Esse é um O maiúsculo, não um zero. Porque não podemos ter uma fonte que distingue entre os dois ...

jasonwryan
fonte
[picar] Nós temos uma fonte assim agora. :)
muru
4

Há um bom utilitário no repositório AUR (aur / pacdep).

O pacdep tem muitas opções - apenas um exemplo - encontre pacotes opcionais para "thunar-archive-plugin":

> pacdep -oppp thunar-archive-plugin
[...]
Optional dependencies:    6.16 MiB
  extra/file-roller     3.89 MiB
  extra/kdeutils-ark    1.12 MiB
  community/xarchiver   1.16 MiB
[...]

A saída acima significa que nenhum dos pacotes opcionais está instalado. Depois de instalar o "xarchiver", a saída se parece com

[...]
Optional dependencies:    6.16 MiB
 local:    1.16 MiB
  xarchiver            1.16 MiB
 sync:     5.01 MiB
  extra/file-roller    3.89 MiB
  extra/kdeutils-ark   1.12 MiB
[...]

Encontrei (a primeira parte) esta resposta em
http://mywaytoarch.tumblr.com/post/34979742718/easily-list-package-dependencies

Martin Schneeweis
fonte
3

Isso não é exatamente eficiente, mas encontrará o que você deseja (em COLOR!):

pacman -Q > /tmp/paccache
for pkg in $(awk '{print $1}' /tmp/paccache) ; do 
   echo -n "$pkg => "; 
   for dep in $(pacman -Qi $pkg | awk -F: '/Optional Deps/{gsub(/[\<\>=].*/,"");print $NF;}' ) ; do 
       grep -q "$dep" /tmp/paccache && COLOR=32 ; echo -en "\e[1;${COLOR:-31}m${dep}\e[0;m " ; unset COLOR ; 
   done 
   echo
done 
DarkHeart
fonte
Eu não estou absolutamente certo, mas que não deve ser ||, em vez de &&depois do grepe, em seguida, entre parênteses ao redor do resto da linha?
Rörd
E mais importante, isso provavelmente deve usar a seção "Depósitos opcionais" em vez da seção "Depende de" da saída do pacman.
Rörd
Por exemplo, com xmms2 :pacman -Qi xmms2 | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1 | cut -c19- | cut -d: -f1
i336_ 2/16/16
2

Embora eu tenha percebido que a solução do @ DarkHeart realmente não funciona, isso me inspirou a fazer uma solução funcional. (sem cores, no entanto)

Estou usando o pacote-query , uma ferramenta semelhante ao invés do expac, sugerida pelo @jasonwryan, porque eu já o instalei (é uma dependência do yaourt). Deve ser trivial alterar isso para usar expac.

A listagem de todas as dependências opcionais é feita principalmente pela chamada para consulta de pacote. O primeiro loop for remove as explicações; portanto, apenas os nomes dos pacotes para as dependências opcionais permanecem; o segundo loop for remove as dependências já instaladas em sua primeira linha antes de imprimir os resultados na segunda.

#!/usr/bin/perl
use strict;
use warnings;

my %deps;
for (`package-query -Q -f'%n %O'`) {
    $deps{ (/^(\S+)/)[0] } = [/(\S+):/g];
}
my @pkgs = keys %deps;
for my $pkg (@pkgs) {
    my @missing_deps = grep { !($_ ~~ @pkgs) } @{ $deps{$pkg} };
    print "$pkg => @missing_deps\n" if @missing_deps;
}
Rörd
fonte
2

Isso deve fazer o truque:

comm -23 <(expac -l"\n" "%o" | sort -u) <(expac -l"\n" "%n\n%S" | sort -u)

A primeira entrada para commlista todas as dependências opcionais, a segunda entrada todos os pacotes instalados e seus atributos 'fornecer'. Ambas as listas são classificadas e contêm cada elemento apenas uma vez devido a sort -u. Em seguida, apenas as linhas são mostradas que estão contidas na primeira, mas não na segunda lista.

(editado para incorporar a sugestão de @ Archemar)

domingo
fonte
0

Às vezes você tem que trabalhar para trás ... primeiro encontre todas as dependências não opcionais, depois faça referência cruzada com a lista completa e use o uniq. Isso irá gerar uma lista de dependências opcionais instaladas.

Encontre tudo instalado

pacman -Q

Encontre todos os itens não opcionais:

pacman -Qent

As entradas exclusivas devem, portanto, ser opcionais:

(pacman -Q; pacman -Qent) | sort | uniq -u 

Gerar lista de opções ausentes ausentes depende das descrições, não é bonito, mas funciona.

pacman -Q > /tmp/paccache; for pkg in $(awk '{print $1}' /tmp/paccache); do pacman -Qi $pkg | grep "^Optional Deps" | grep -v None >/dev/null && echo $pkg >> /tmp/hasdeps; done

for pkg in $(awk '{print $1}' /tmp/hasdeps); do echo -ne "Package: $pkg ___ "; (pacman -Qi $pkg | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1) | grep -v installed; echo ___; done | grep -v "___ ___" | sed -e 's/Optional Deps/ /' -e 's/___//' | sed -e 's/ \+/ /g'
kevinf
fonte
0

Eu tentei apenas no GNU sed, mas

yay -Qi | sed -n '/Optional Deps/{:l s/.* \([a-zA-Z0-9.\-]\+\):.*/\1/p; n; /Required By/!bl}'

funcionou (use sort / uniq como quiser).

Yuki Ito
fonte