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 foodependía de , bary bazluego apt-mark showmanualgenerarí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):parallelapt-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 showmanualson exactamente losapt.cache.Cache()queis_installedson verdaderos yis_auto_installedfalsos. Pero, es más fácil procesar las dependencias:Incluso esto enumera algunos paquetes que no esperaría ver allí (
init,grep?!).fuente
initygrep(¿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 quepythonimprime el código anterior . Posiblemente no se instalaron los elementos faltantesapt.pythoncó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é
tsorten 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
dasherpaquete. En mi sistema, el código OP canalizado a través de lassort -Vsalidas 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.