Listar paquetes instalados explícitamente

53

En Gentoo hay un archivo /var/lib/portage/worldque contiene paquetes que instalé explícitamente. Por explícito quiero decir, paquetes que elijo, sin incluir nada instalado por defecto o extraído por las dependencias.

¿Hay un archivo similar o un comando para encontrar esa información en Ubuntu?

phunehehe
fuente

Respuestas:

46

Solo el código

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
  | cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

Explicación

Una forma de pensar sobre este problema es dividir esto en tres partes:

  • ¿Cómo obtengo una lista de paquetes no instalados como dependencias?
  • ¿Cómo obtengo una lista de los paquetes instalados por defecto?
  • ¿Cómo puedo obtener la diferencia entre estas dos listas?

¿Cómo obtengo una lista de paquetes no instalados como dependencias?

El siguiente comando parece funcionar en mi sistema:

$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt

Se pueden encontrar enfoques similares en los enlaces que Gilles publicó como un comentario a la pregunta. Algunas fuentes afirman que esto solo funcionará si utilizó aptitude para instalar los paquetes; sin embargo, casi nunca uso aptitude para instalar paquetes y descubrí que esto todavía funcionaba. Esto --disable-columnsevita que la aptitud rellene las líneas de los nombres de los paquetes con espacios en blanco que dificultarían la comparación a continuación. El | sort -uordena el archivo y elimina los duplicados. Esto hace que el paso final sea mucho más fácil.

¿Cómo obtengo una lista de los paquetes instalados por defecto?

Nota: Esta sección comienza con una 'ruta incorrecta' que creo que es ilustrativa. El segundo fragmento de código es el que funciona.

Esto es un poco más complicado. Inicialmente pensé que una buena aproximación serían todos los paquetes que son dependencias de los metapaquetes ubuntu-minimal, ubuntu-standard, ubuntu-desktop y los diversos paquetes relacionados con el kernel de linux. Algunos resultados en las búsquedas de Google parecían utilizar este enfoque. Para obtener una lista de estas dependencias, primero probé lo siguiente (que no funcionó):

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

Esto parece omitir algunos paquetes que sé que tuvieron que venir por defecto. Todavía creo que este método debería funcionar si uno construye la lista correcta de metapaquetes.

Sin embargo, parece que los espejos de Ubuntu contienen un archivo "manifiesto" que contiene todos los paquetes en la instalación predeterminada. El manifiesto para Ubuntu 12.04.3 está aquí:

http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest

Si busca a través de esta página (o la página de un espejo más cercano a usted):

http://mirror.pnl.gov/releases/precise/

Debería poder encontrar el archivo ".manifest" que corresponde a la versión y arquitectura que está utilizando. Para extraer solo los nombres de los paquetes, hice esto:

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt

Es probable que la lista ya esté ordenada y sea única, pero quería estar seguro de que estaba ordenada correctamente para facilitar el siguiente paso. Luego puse la salida en defaultinstalled.txt.

¿Cómo puedo obtener la diferencia entre estas dos listas?

Esta es la parte más fácil ya que la mayoría de los sistemas tipo Unix tienen muchas herramientas para hacer esto. La commherramienta es una de las muchas formas de hacer esto:

comm -23 currentlyinstalled.txt defaultinstalled.txt

Esto debería imprimir la lista de líneas que son exclusivas del primer archivo. Por lo tanto, debe imprimir una lista de paquetes instalados que no están en la instalación predeterminada.

Steven D
fuente
¿Qué hace tu primera tubería que aptitude search '~i!~M' -F %pno lo hace?
Ephemient
@ephemient: Probablemente nada. No sé mucho sobre aptitud y, por lo tanto, utilicé herramientas con las que estoy familiarizado en lugar de buscar en el archivo man de un programa que nunca uso.
Steven D
1
Destruiste
3
Esto casi funciona, pero aún no es correcto. Hay varios paquetes y bibliotecas que ciertamente no instalé manualmente contenidos en la lista resultante. Utilicé http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifesty el adicional | sed "s/ *$//"pero aún no dados.
jmiserez
1
El primer paso que obtiene una lista de paquetes no instalados como dependencias puede reemplazarse apt-mark showmanual | sort -u, como se muestra en otras respuestas. Más simple y no depende de aptitudecuál no está instalado por defecto.
skagedal
24

Puede usar cualquiera de estos dos one-liners. Ambos producen exactamente el mismo resultado en mi máquina y son más precisos que todas las soluciones propuestas hasta ahora (julio de 2014) en esta pregunta. Son una combinación de las dos respuestas (1) y (2) . Tenga en cuenta que originalmente publiqué esta respuesta aquí .

Utilizando apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Utilizando aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Muy pocos paquetes aún se quedan atrás, aunque sospecho que estos son realmente instalados por el usuario, ya sea justo después de la instalación a través de la configuración de localización del idioma o, por ejemplo, a través del instalador de códec Totem. Además, las versiones de encabezado de Linux también parecen acumularse, a pesar de que solo he instalado el metapaquete no específico de la versión. Ejemplos:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Como funciona

  1. Obtenga la lista de paquetes instalados manualmente. Por aptitud, el adicional sedelimina el espacio en blanco restante al final de la línea.
  2. Obtenga la lista de paquetes instalados inmediatamente después de una nueva instalación.
  3. Compare los archivos, solo muestre las líneas del archivo 1 que no están presentes en el archivo 2.

Otras posibilidades no funcionan tan bien:

  • Usando el ubuntu-14.04-desktop-amd64.manifestarchivo ( aquí para Ubuntu 14.04) en lugar de /var/log/installer/initial-status.gz. Se muestran más paquetes como instalados manualmente aunque no lo sean.
  • Usando en apt-mark showautolugar de /var/log/installer/initial-status.gz. apt-markpor ejemplo, no incluye el paquete xserver-xorg, mientras que el otro archivo sí.

Ambos enumeran más paquetes que la solución anterior.

jmiserez
fuente
Si ha actualizado su sistema desde su instalación inicial (que es el caso para la mayoría de las personas, creo), es mejor usar el archivo de manifiesto de su versión actual de lanzamiento de Ubuntu.
Diego V
Si ha actualizado, creo que necesitaría usar ambos archivos, no solo el archivo de manifiesto. Puede hacerlo fácilmente simplemente agregando otra comparación. Desafortunadamente, el archivo de manifiesto no contiene todo lo que contiene el archivo initial_status.gz (lo comprobé).
jmiserez
¡Estoy impresionado! Sin embargo, encontré una pieza que faltaba. ¿Qué pasa con los paquetes que se instalaron inicialmente pero luego se eliminaron explícitamente manualmente , sin embargo, luego se reinstalaron explícitamente de forma manual ? Encontré esto en un sistema de trabajo.
n611x007
1
Hice una pregunta unix.SE/225330: Lista de paquetes eliminados explícitamente (apt) para abordar la mayor parte del trabajo.
n611x007
1
Esto es mejor que la solución aceptada, ya que la URL mirror.pnl.gov/releases/precise/… en la solución aceptada ahora es 404.
rmunn
9

De acuerdo a man apt-mark:

apt-mark showauto
apt-mark showmanual
mmaruska
fuente
2
showmanualmuestra cosas como xserver-xorg-video-vesa, que juro que no instalé manualmente.
phunehehe
probablemente instalado automáticamente por su distribución en la primera instalación.
Matt
8

Aquí hay algunos resultados de muestra de cat /var/log/apt/history.log:

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

En cuanto a su pregunta, filtre las cosas con grep ( cat /var/log/apt/history.log | grep Commandline).

Tenga en cuenta que estos archivos están rotados, así que busque otros para no perderse nada:

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

NOTA :

  • He comprobado tanto aptitude como synaptic (versiones 0.70 y 0.6.3 respectivamente), y ambos registran sus actividades en ese archivo de registro. El único inconveniente con ellos es que no tienen la línea que comienza Commandline, por lo que el greptruco no funcionará con ellos.
tshepang
fuente
2
Solución interesante Deberá ajustar un poco el comando grep para obtener una lista de paquetes y tener en cuenta los paquetes instalados por aptitudey otros administradores de paquetes. Si sus registros se han girado, entonces no tiene suerte.
Steven D
@steven Actualizado. Mi grep-fu es un novato, así que se lo dejaré al lector. Además, no sé si la cosa gira lejos. Solo tengo que archivar allí yo mismo.
tshepang el
Si giran lejos dependerá de su configuración de logrotate y de cuánto tiempo ha estado funcionando su sistema. No estoy seguro de los valores predeterminados de Ubuntu ya que ha pasado mucho tiempo desde que los cambié.
Steven D
7

Me encontré con esta hermosa línea mientras buscaba esta consulta

El único revestimiento es

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )`

Este oneliner filtra los paquetes instalados por el sistema utilizando registros de /var/log/installer/initial-status.gz

Publicaré el enlace al hilo original cuando lo encuentre, ya que este oneliner no es mío y parece que no puedo recordar dónde lo vi.

Archit
fuente
3

Le gustaría echar un vistazo a este artículo .

Al final del artículo, hay un script de Python que debe hacer lo que quieras.

Fue escrito para (k) ubuntu . pero también debería funcionar para Ubuntu .

Stefan
fuente
3
el enlace ya no parece funcionar.
rog
2
Los enlaces rotos como estos son la razón por la cual es importante incluir la información relevante en su respuesta.
whitehat101
2

A continuación se muestra una adición a Steven D's respuesta .

La siguiente línea parece estar truncando los nombres de paquetes con 32 caracteres:

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

Esto parece funcionar:

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

ver esta respuesta

Wes Turner
fuente
1

Revisa /var/log/apt/term.log

Joril
fuente
2
que es una manera bastante doloroso para hacer las cosas, y no hay distinción entre paquetes instalo mí mismo, y los sacó para cumplir las dependencias
phunehehe
Estoy de acuerdo, pero no sabía que apt realiza un seguimiento de ellos: / Ahora lo sé, gracias a Stefan :)
Joril
1

También puede mirar el archivo /var/lib/apt/extended_states.

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

Esto es útil si desea saber qué se instaló en una partición antigua.

Laurent Lyaudet
fuente
0

¡Muchas gracias y felicidades a quienes crearon esa joya de guión!
Quería agregar mis 2 ¢ y añadí la fecha de instalación que deduzco de $ info.
No dominé los detalles de por qué los archivos $ info se actualizan o no y cuándo, pero funciona en la práctica.
Mi secuencia de comandos enumera las últimas actualizaciones de paquetes de no dependencia agregados después de la instalación.
Al darle una verificación periódica, estaba viendo lo que habría registrado manualmente sin una sola falla.
Es decir, lotes de paquetes instalados por la misma razón. Desafortunadamente, las actualizaciones rompen ese orden.
Después de una actualización del sistema, tenía una lista de mis paquetes agregados que la actualización no actualizó, seguidos de los que sí.
¡Ordenado! Disfrutar.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
Papou
fuente