Existem várias maneiras de mostrar os pacotes instalados manualmente apt
, como:
apt-mark showmanual
Mas, às vezes, esse resultado é demais. Por exemplo, se o usuário instalou o pacote manualmente foo
:
apt-get install foo
... e foo
dependia bar
e baz
, em seguida apt-mark showmanual
, produziria:
bar
baz
foo
Como podemos listar apenas os pacotes de nível superior instalados manualmente ( ie foo
) sem suas dependências ( ie não baz
, nem bar
)?
O código a seguir parece funcionar, mas a chamada GNU algumas centenas de vezes é muito lenta (três horas com uma CPU de 4 núcleos):parallel
apt-rdepends
apt-mark showmanual |
tee /tmp/foo |
parallel "apt-rdepends -f Depends,PreDepends,Suggests,Recommends {} |
tail +2" 2> /dev/null |
tr -s ' ' '\n' |
grep -v '[():]' |
sort -Vu |
grep -wv -f - /tmp/foo
Respostas:
Isso pode ser feito usando a API apt do Python. Os pacotes que você vê
apt-mark showmanual
são exatamente osapt.cache.Cache()
queis_installed
são verdadeiros eis_auto_installed
falsos. Mas, é mais fácil processar as dependências:Mesmo isso lista alguns pacotes que eu não esperaria ver lá (
init
,grep
?!).fonte
init
egrep
(talvez seus dados apt estejam corrompidos?), Também mostra muitas bibliotecas. OTOH, meu código de 3 horas perde alguns itens que deveriam estar lá, itens que opython
código acima imprime. Possivelmente os itens ausentes não foram instaladosapt
.python
código acima é 3600 vezes mais rápido (ou seja, levou 3 segundos) que o meu código (3 horas). Ansioso para testar a versão recursiva ...O script de shell a seguir procura os pais de todas as dependências instaladas.
Eu usei
tsort
neste script. Presumo que, ao adicionar um marcador no final sem dependências, o marcador também será a última entrada sem dependências no meu resultado. Para que eu possa diferenciar entre o último pacote sem dependências e o primeiro pacote com dependências.Percebi um problema com esta solução:
Existem ciclos no gráfico de dependência. Essas entradas são ignoradas por
tsort
.fonte
Você pode encontrar todos os pacotes instalados manualmente sem o primeiro nível de dependências, como a seguir:
Você também pode usar a seguinte mágica de uma linha:
fonte
dasher
pacote. No meu sistema, o código OP passou porsort -V
saídas 475 linhas, o código de muru produz 914 linhas (incluindodasher
) e o código desta resposta gera 995 linhas.