it-swarm-es.tech

Listar paquetes instalados explícitamente

En Gentoo está el archivo /var/lib/portage/world que 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?

53
phunehehe

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 dividirlo 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 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. Los --disable-columns evita que aptitude rellene líneas de nombres de paquetes con espacios en blanco que dificultarían la comparación a continuación. Los | sort -u ordena 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 herramienta comm 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.

46
Steven D

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í .

Usando apt-mark:

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

Usando 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 caen en el olvido, 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 de 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, aunque 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    

Cómo funciona

  1. Obtenga la lista de paquetes instalados manualmente. Por aptitud, el sed adicional elimina 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:

  • Utilizando la ubuntu-14.04-desktop-AMD64.manifest archivo ( 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.
  • Utilizando apt-mark showauto en vez de /var/log/installer/initial-status.gz. apt-mark por ejemplo no incluye el paquete xserver-xorg, mientras que el otro archivo sí.

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

24
jmiserez

De acuerdo a man apt-mark:

apt-mark showauto
apt-mark showmanual
9
mmaruska

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 .7 y .6. 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 con Commandline, por lo que el truco grep no funcionará con ellos.
8
tshepang

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.

7
Archit

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

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

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

3
Stefan

A continuación hay una adición a respuesta de Steven D .

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

2
Wes Turner

Revisa /var/log/apt/term.log

1
Joril

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.

1
Laurent Lyaudet

¡Muchas gracias y felicitaciones 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 script enumera las últimas actualizaciones de los 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
0
Papou