Hay muchas formas de mostrar los paquetes instalados manualmente usando apt
, como:
apt-mark showmanual
Pero a veces esa salida es demasiado. Por ejemplo, si el usuario instaló manualmente el paquete foo
:
apt-get install foo
... y foo
dependía de , bar
y baz
luego apt-mark showmanual
generaría:
bar
baz
foo
¿Cómo podemos enumerar solo los paquetes de nivel superior instalados manualmente ( es decir foo
) sin sus dependencias ( es decirbaz
, no , ni bar
)?
El siguiente código parece funcionar, pero las llamadas de GNU unas cientos de veces son demasiado lentas (tres horas con una 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
Respuestas:
Esto podría hacerse usando la API de Python apt. Los paquetes que ve
apt-mark showmanual
son exactamente losapt.cache.Cache()
queis_installed
son verdaderos yis_auto_installed
falsos. Pero, es más fácil procesar las dependencias:Incluso esto enumera algunos paquetes que no esperaría ver allí (
init
,grep
?!).fuente
init
ygrep
(¿quizás sus datos aptos están corruptos?), También muestra demasiadas bibliotecas. OTOH, mi código de 3 horas pierde algunos elementos que deberían estar allí, elementos quepython
imprime el código anterior . Posiblemente no se instalaron los elementos faltantesapt
.python
código anterior es 3600 veces más rápido (es decir, tardó 3 segundos) que mi código (3 horas). Estamos ansiosos por probar la versión recursiva ...El siguiente script de shell busca los padres de todas las dependencias instaladas.
Utilicé
tsort
en este script. Supongo que al agregar un marcador al final sin dependencias, el marcador también será la última entrada sin dependencias en mi resultado. Entonces puedo diferenciar entre el último paquete sin dependencias y el primer paquete con dependencias.Noté un problema con esta solución:
hay ciclos en el gráfico de dependencia. Esas entradas son ignoradas por
tsort
.fuente
Puede encontrar todos los paquetes instalados manualmente sin su primer nivel de dependencias de la siguiente manera:
También puedes usar la siguiente magia de una línea:
fuente
dasher
paquete. En mi sistema, el código OP canalizado a través de lassort -V
salidas de 475 líneas, el código de muru genera 914 líneas, (incluidodasher
), y el código de esta respuesta genera 995 líneas.