Generar una lista de paquetes instalados manualmente y consultar paquetes individuales

183

Me gustaría obtener una lista de paquetes instalados manualmente por apto aptitudey poder averiguar si un foobarpaquete se instaló manual o automáticamente. ¿Hay alguna forma ordenada de hacerlo desde la línea de comandos?

Umang
fuente
Consulte esta respuesta en unix.stackexchange.com para obtener una solución que filtra los paquetes de stock.
Dirk Bergstrom
Posible duplicado? - askubuntu.com/questions/365
jrg
Muy buena solución que excluye los paquetes instalados por defecto: Ubuntu enumera los paquetes instalados explícitamente
pcworld
Cuidado con los comentarios de las respuestas aquí. La gente no dice que aparezcan más paquetes, pero se están olvidando de que hay paquetes de dependencias instalados desde un manual instalado.
Andre Figueiredo

Respuestas:

206

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 (6 de julio de 2014) en esta pregunta.

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 caen en el olvido, aunque sospecho que estos son realmente instalados por el usuario, ya sea 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, 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    

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

Utilicé varias otras publicaciones de StackExchange como referencias, sin embargo, ninguna funciona tan bien como la solución anterior:

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

EDITAR: qué hacer si ha actualizado desde una versión anterior:

Si ha actualizado Ubuntu de una versión a la siguiente, probablemente necesitará ajustar este proceso. En ese caso, verificaría el archivo de manifiesto de la versión más reciente (ver arriba) además del archivo initial-status.gz de la versión actual. Puede hacerlo fácilmente simplemente agregando otra comparación. Usar solo el archivo de manifiesto no funcionará, ya que desafortunadamente el archivo de manifiesto no contiene todo lo que contiene el archivo initial_status.gz (lo comprobé).

jmiserez
fuente
77
Esto no funcionó para mí porque /var/log/installer/initial-status.gzfalta. ¿También quiero saber si esto depende del marcado de los apartamentos manualo no?
Anwar
1
Por desgracia, no hay manifiesto para las versiones del servidor.
Antti Haapala
Ejecuté el showmanualcomando (abajo). Y use commpara comparar las dos listas (ordenadas). El showmanualresultado me dio 1.840 paquetes únicos más de apt-mark showmanualno mostrados por este método. NO los paquetes fueron exclusivos de la salida de este commcomando. Creo que es más interesante registrar que para mi PC, 894 paquetes se enumeran en Ambos resultados. No estoy seguro de por qué hay una gran discrepancia. Algunos (¿muchos?) Paquetes parecen ser específicos de la versión. Otros como XOrg, componentes GTK y lib*cosas podrían ser actualizaciones. De todos modos, esta respuesta es un muy buen comienzo.
será
Acabo de comparar sus soluciones con apt-mark showmanual. Es interesante cuántas diferencias son visibles. su lista tiene 238 paquetes, mientras que showmanual devuelve 1717 paquetes. De los 2179 paquetes instalados, solo hay 223 en ambas listas, 15 están solo en los suyos (ejemplos: nodejs, lightdm) y 223 solo están en showmanual (ejemplos: xserver-xorg, ubuntu-desktop). Parece que su lista es más útil, pero sin saber de dónde provienen estas diferencias, no es fácil decidir ... (pero estoy bastante seguro de que instalé nginx y lightdm manualmente ...) [lo siento, acabo de escribir lo mismo;)]
Daniel Alder
64

En las versiones más recientes del paquete apt, también existe el comando apt-mark

apt-mark showmanual
Daniel Alder
fuente
35
Esto muestra mucho más paquetes de los que he instalado manualmente.
Umang
1
@Umang Tienes razón. Yo diría que esto no fue así cuando escribí esta respuesta. No hay ninguna razón en mi sistema para considerar linux-image-3.11.0-*-genericetc. como manual
Daniel Alder
1
@Umang quizás esto te ayude a preguntarubuntu.com/questions/432743/… , pero la respuesta no es aceptada. El hecho es que muchos paquetes de una instalación nueva ya están marcados como manuales. Pero todavía hay algunas cosas extrañas. Para quedarme con mi ejemplo: linux-image-3.13.0-24-generices manual pero el actual linux-image-3.13.0-27-generices automático. Parece que una actualización de un paquete de referencia (en este caso linux-image-generic, que cambió las dependencias), la marca manual se establece automáticamente
Daniel Alder
55
@DanielAlder algunos paquetes de una instalación nueva deben marcarse como manuales. Si no hay paquetes marcados como manuales, todo el sistema podría eliminarse con apt-get autoremove. Esto definitivamente no es lo que quieres.
Anton K
2
Si "instalado manualmente" significa "instalado por el usuario después de la instalación inicial del sistema operativo", esta no es una respuesta correcta.
Seamus
21

Para Ubuntu 16.04, consulte el archivo de registro /var/log/apt/history.log.

Por ejemplo:

zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz

No es perfecto, pero es bastante bueno para dejar en claro exactamente lo que instalé a mano. Coloque un -B 1grep para ver cuándo se instaló.

Salida de ejemplo

Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade

No estoy seguro si esto se repite aptitudeo no. Parece que no recoge las instalaciones de la aplicación de escritorio Ubuntu Software.

s1037989
fuente
1
De todas las respuestas a lo largo de los años, esta es la única que incluso se acerca en el servidor 18.04.
Quentin Skousen
20

apt-mark showauto | grep -iE '^foobar$' generará "foobar" si el paquete se instaló automáticamente, nada de lo contrario.

aptitude search '!~M ~i'enumerará los paquetes que no se instalaron automáticamente. Es una lástima que la aptitud no sea parte de la instalación predeterminada en Ubuntu Desktop a partir de 10.10.

Li Lo
fuente
aptitude searchmuestra TODOS los paquetes, no solo los que se instalan manualmente (supongo que eso es lo que quería el OP)
Oli
1
@Oli: mira en los patrones de búsqueda de aptitud; el patrón que estoy usando allí debería hacer exactamente lo que quiere el OP.
Li Lo
Lo corrí . Muestra una carga completa de paquetes que no están instalados.
Oli
77
Algo no está bien con esto, lo estoy usando aptitude search '!~M ~i'y enumera 1043 paquetes. No hay forma de que haya instalado tantos paquetes manualmente.
ThatGraemeGuy
Esto definitivamente no funciona como se solicitó, también imprime paquetes preinstalados.
Irfy el
9

El siguiente script imprimirá todos los paquetes que no están configurados para la instalación automática y, por lo tanto, se instalaron manualmente:

#!/usr/bin/python

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

se basa en cómo apt-mark imprime los paquetes instalados automáticamente.

txwikinger
fuente
Felicitaciones a usted bien señor. Esto realmente funciona, en contraste con la respuesta aceptada.
Irfy el
mostrar solo un par de paquetes para mí --- definitivamente faltan muchos de ellos.
Rmano
Lo mismo aquí, definitivamente faltan paquetes instalados manualmente, justo después de que los instalé.
David Ljung Madison
El uso sys.exit(1)sin import syspuede provocar un error en las versiones más recientes de python. Ya sea import syso uso exit(1).
Videonauth
7

Para obtener una lista de todos los paquetes (no instalados, instalados por el usuario o instalados de manera predeterminada, en todos los PPA), aptutilice el siguiente método:

apt list [option]

Las posibles opciones útiles para esto son:

--installed para mostrar solo los paquetes que están instalados en el sistema (de más de 50,000+)

--manual-installedpara enumerar los paquetes que un comando instaló explícitamente , ya sea directamente o como dependencias.

Alternativamente, podrías hacer:

apt list --manual-installed | grep -F \[installed\] para obtener una lista de los paquetes que resultaron de los comandos del usuario y sus dependencias únicamente, y para obtener información adicional sobre ellos, como la versión y la arquitectura compatibles (x86, x86_64, amd64, todas, etc.)

Aalok
fuente
5

Como varias personas han comentado, apt-mark showmanual parece estar un poco defectuoso (y lo informé como error 727799 ). Cuando lo estoy usando, en realidad informa muchas cosas que ni siquiera están conectadas / var / lib / apt / extended_states (donde se supone que está almacenado) y apt-get no está registrando cosas como instaladas en / var / lib / apt / extended_states (solo en / var / lib / dpkg / status). El script de Python de txwikinger anterior se basa directamente en / var / lib / apt / extended_states, pero si lo usa hoy, la sintaxis podría no funcionar (la mía acaba de comenzar a generar errores con Kubuntu 13.10). La sintaxis actualizada es:

#!/usr/bin/python
import sys

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

Para mí, esta fue una lista muy corta de 5 elementos que tampoco parece ser precisa.

codificador
fuente
1
El uso sys.exit(1)sin import syspuede provocar un error en las versiones más recientes de python. Ya sea import syso uso exit(1).
Videonauth
4

Me gustaría dar una solución GUI.

ingrese la descripción de la imagen aquí

  1. Abierto Synaptic Package Manager

  2. Ir Status

  3. Hacer clic Installed (manual)

Le dará la lista de paquetes instalados manualmente por apt o aptitude.

Lamentablemente, no pude encontrar ninguna opción Custom Filterspara averiguar si un foobarpaquete se instaló manual o automáticamente.

Si el paquete está debajo Installedpero no debajo Installed (manual), se instaló automáticamente. Si el paquete está debajo Installed (manual), se instaló manualmente.

rayo azul
fuente
2

Si nadie le da una buena respuesta usando un comando apr-something, puede hacerlo de la manera difícil . Apt-get almacena su información en / var / lib / apt / extended_states. Cualquier archivo que se instale automáticamente se agregará a este archivo. Si instala un paquete que ya está en este archivo manualmente, el paquete permanecerá en este archivo pero con Instalación automática: 0 en la segunda línea. No está borrado.

Nota: Como se esperaba, mejores respuestas que probablemente funcionen si han aparecido cambios en la ubicación de los archivos. Mantengo la mía por si la información sobre la ubicación del archivo es útil.

Javier Rivera
fuente
1
No. Eché un vistazo rápido a ese archivo para encontrar que liferea estaba marcado como autoinstalado. Hice un apt-get install lifereay no se instaló, pero obtuve un resultado que era algo así como "marcado como instalado manualmente". Ahora liferea todavía está en el archivo, excepto que la siguiente línea tiene un en 0lugar de un 1. Además, debe cambiar su patrón de expresión regular en " foobar$"lugar de solo foobar.
Umang
Es verdad. Mi culpa, en mi sistema no hay una línea con 0, pero debería ser algo raro. Actualizo la respuesta por si acaso.
Javier Rivera
2

Después de buscar mucho en Google, he logrado armar este script. Funciona bien para mí:

# List of all packages currently installed
current=$(dpkg -l | awk '{print $2}' | sort | uniq)

# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)

# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)

# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )

for pack in $packages; do
    packname=$(echo $pack | cut -f 1 -d ":")
    desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
    date=$(date -r /var/lib/dpkg/info/$pack.list)

    echo "# $desc"
    echo "# $date"
    echo "sudo apt-get install $pack"
    echo -e ""
done
dufferZafar
fuente
Podrías usar en sort -ulugar de sort | unique. Como apt-markno muestra la arquitectura, debe eliminarla de la salida de dpkg antes de las operaciones establecidas (o uso dpkg-query -W -f='${Package}\n'). Además, dpkg puede enumerar algunos paquetes que no están instalados actualmente. En cuanto a "desc", puede usar `dpkg-query -W -f = '# $ {binary: Summary} \ n' $ pack, que es más rápido.
jarno
Oh, apt-markpuede mostrar arquitectura para algunos paquetes, pero no para tantos dpkg -l.
jarno
apt-cache searches lento. Obtener una lista de fechas instaladas por adelantado usando algo como help.ubuntu.com/community/ListInstalledPackagesByDate podría ser más eficiente
opticyclic
1

Como dijo Li Lo, apt-mark showautodebería obtener una gran lista de cosas instaladas automáticamente.

Ahora, para mostrar las cosas que se instalan manualmente, resulta que hay un modificador de búsqueda simple y encantador para la aptitud. Pero no quieres hacer eso. Desea escribir un gran comando bash que haga algo de ciencia espacial.

Nota: Esta es más una ilustración de lo genial que lucirás al eliminar comandos masivos de bash para todos tus amigos.

comm -3  <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)

Lo partí en dos líneas para facilitar la lectura. ¿Qué hace esto?

  • Primero consultamos dpkg para obtener una lista de los paquetes que están instalados.
  • Los filtramos por los que están realmente instalados (no solo la configuración residual)
  • Cortamos el estado
  • Comparamos esa lista con la lista automatizada de apt-mark
  • Nos balanceamos porque podemos.
Oli
fuente
Dudo que esto sea correcto, ya que dpkg a menudo muestra paquetes que no están instalados
txwikinger
Sé lo que quieres decir, pero mi bash-fu no es lo suficientemente fuerte. Sé que podría mostrar el estado de dpkg-query, grep y luego cortar el estado. Voy a intentarlo
Oli
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)es adecuadamente mejor;)
LassePoulsen
-1

Esto enumerará todos los paquetes instalados manualmente sin: dependencias, paquetes desinstalados, paquetes instalados durante la instalación del sistema.

unopts() {
  in=`cat`
  echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}

list() {
  cat '/var/log/apt/history.log' |
  grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
  egrep --color=never "Commandline: apt-get.* $1" |
  sed -r "s/Commandline: apt-get//;s/ $1//" |
  unopts |
  tr ' ' '\n' |
  sed '/^$/d'
}

hapt() {
  tmp=`mktemp -d`
  installed=$tmp/installed
  deleted=$tmp/deleted
  dpkg=$tmp/dpkg
  list 'install' > $installed
  list '(remove|purge|autoremove)' > $deleted
  dpkg --get-selections |
  grep -v 'deinstall' |
  cut -f 1 > $dpkg
  while read package
  do
    sed -i "0,/$package/{//d;}" $installed
  done < $deleted
  while read package
  do
    if [ -z "`grep --color=never "^$package$" $dpkg`" ]
    then
      sed -i "0,/$package/{//d;}" $installed
    fi
  done < $installed
  cat $installed
  rm -r $tmp
}
wieczorek1990
fuente