Lista de dependencias (recursivas) de los paquetes instalados en APT

17

Para cada paquete que he instalado, me gustaría saber qué paquetes se instalarían si lo desinstalo. Un ejemplo de la salida que necesito es ( package: list of deps):

abc: foo bar
bcd: baz abc
bdd: baz fuubar

Adjuntar

Si verifico lo que realmente se eliminaría si elimino el paquete pppusando apt-get:

$ echo $(apt-get --dry-run remove ppp | grep '^Remv ' | cut -d' ' -f2)
gnome-ppp mint-meta-xfce network-manager-pptp-gnome network-manager-pptp wvdial pppoeconf pppoe pptp-linux pppconfig ppp

Veo que es diferente de lo apt-cacheque me muestra el programa (que no creo que incluya dependencias recursivas):

$ apt-cache show ppp | grep '^Breaks: '
Breaks: network-manager (<= 0.8.0.999-1), network-manager-pptp (<= 0.8.0.999-1), pppdcapiplugin (<= 1:3.9.20060704+dfsg.1-1)

Añadir 2

¿Es dpkg --get-selections | cut -f1una forma confiable de obtener una lista de paquetes instalados para iterar?

Eliminado
fuente
1
El análisis se apt-get --dry-run removeve básicamente correcto. Puede faltar algunos paquetes instalados automáticamente que solo son necesarios para los paquetes instalados automáticamente que solo son necesarios para el paquete que elimina. ¿Es por eso que no lo consideras una respuesta adecuada?
Gilles 'SO- deja de ser malvado'
relacionado: askubuntu.com/questions/468753/recursive-dependencies
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

11

Hiciste algunas preguntas diferentes aquí, espero que al menos pueda ayudar en una o dos.

Para enumerar todos los paquetes instalados, utilice dpkgpara generar en una lista separada por campos

dpkg -l 

Para obtener la lista de paquetes, sin campos adicionales, para que pueda canalizarla a otro lugar.

dpkg -l | awk '{print $2 }' # Pipe to grep after the awk, or glob from dpkg

Por ejemplo, si quiero eliminar un núcleo antiguo,

apt-get purge `dpkg -l linux* | awk '{print $2}' | grep 3.0.0-12`

La forma más fácil de pasar por todas las dependencias innecesarias es con debfoster. Se ejecuta de forma interactiva y pasa por lo que desea, sus dependencias y puede eliminar o enumerar lo que no es una dependencia recursiva.

Para enumerar todas las dependencias recursivas de un paquete específico,

debfoster -d $PACKAGE ## PACKAGE is the specific package.

Después de haber ejecutado debfoster, puede verificar cualquier dependiente que tenga un paquete también,

debfoster -e $PACKAGE ## PACKAGE is the specific package.

Una forma realmente genial de enumerar paquetes 'huérfanos' es con deborphan. Ejecutar deborphansin opciones, y mostrará una lista de todos los paquetes 'huérfanos'. Un 'huérfano' es un paquete del que nada depende y no lo ha instalado explícitamente.

También me gusta limpiar cualquier paquete 'huérfano', después de una nueva instalación. Después de que haya eliminado paquetes específicos, puedes perder cualquier cosa apt-get autoremove --purgecon,

apt-get purge `deborphan`

Finalmente, a veces no lo hace --purgey termina con el paquete 'restos', las versiones más recientes de apt-getpueden eliminarlos automáticamente. Para eliminar todas las 'sobras' de los paquetes desinstalados, ejecute,

apt-get autoclean

Si no tiene la nueva versión de apt-get, siempre puede eliminarlos con estos comandos. Se produce un error si no existen archivos 'sobrantes', parece que el autoclean puede omitir algunos ocasionalmente.

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs dpkg --purge
JM Becker
fuente
debfoster todavía existe, pero se considera reemplazado por características en aptitud
Joshua Clayton
4
apt-cache show pkgname1 pkgname2...

enumerará (entre otras cosas) estas dependencias (tiempo de ejecución). Esto suele ser adecuado, a menos que lo esté alimentando a una máquina para su posterior procesamiento. Si lo desea exactamente en el formato que indicó, probablemente tendrá que escribir un script.

Faheem Mitha
fuente
Lo siento, formulé mi pregunta incorrectamente. Estoy interesado en saber qué paquetes se desinstalarían para cada paquete que haya instalado. Y también necesito enumerar todos los paquetes que he instalado.
Borrado el
2
@Deleted: Lo siento, no vi este comentario hasta ahora. En respuesta a "qué paquetes se desinstalarían para cada paquete que haya instalado" (supongo que desea que se responda esta pregunta por paquete) intente apt-get remove -s packagename. Listado de todos los paquetes que ha instalado es justo dpkg -l.
Faheem Mitha
@FaheemMitha: publicación anterior, ¡pero sigue siendo un gran consejo apt-get remove -s packagename!
twan163
@ twan163 Feliz de haber sido útil para ti.
Faheem Mitha
1

Creo que tienes que continuar y crear un bucle para lo mismo:

apt-cache depends libtext-wrapi18n-perl |xargs apt-cache depends

Por supuesto, eliminar los encabezados.

Golfo pérsico
fuente
2
apt-cache depende tiene una opción de recreaciónapt-cache depends --recurse libtext
Joshua Clayton