Generando una lista de paquetes instalados manualmente y consultando paquetes individuales

145

Me gustaría obtener una lista de paquetes instalados manualmente por apt o aptitude y poder averiguar si un paquete foobar se instaló de forma manual o automática. ¿Hay alguna forma clara de hacerlo desde la línea de comando?

    
pregunta Umang 16.08.2010 - 19:07

12 respuestas

165

Puedes usar cualquiera de estos dos juegos de una línea. 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.

Usar apt-mark :

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

Usar 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 no se han resuelto, aunque sospecho que estos están realmente instalados por el usuario, ya sea inmediatamente 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 linux-header 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. Para aptitude, 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. Compara los archivos, solo muestra las líneas en el archivo 1 que no están en el archivo 2.

Otras posibilidades tampoco funcionan:

  • Utilizando el archivo ubuntu-14.04-desktop-amd64.manifest ( aquí para Ubuntu 14.04) en su lugar de /var/log/installer/initial-status.gz . Se muestran más paquetes como instalados manualmente aunque no lo estén.
  • 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 lo hace.

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

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

EDITAR: Qué hacer si se actualizó desde una versión anterior:

Si ha actualizado Ubuntu de una versión a la siguiente, probablemente necesite 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 el archivo de manifiesto lamentablemente no contiene todo lo que hace el archivo initial_status.gz (lo he comprobado).

    
respondido por el jmiserez 06.07.2014 - 17:01
53

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

apt-mark showmanual
    
respondido por el Daniel Alder 17.05.2012 - 18:21
19

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

aptitude search '!~M ~i' mostrará una lista de 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 las 10.10.

    
respondido por el Li Lo 16.08.2010 - 19:32
11

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 1 en grep para ver cuándo se instaló.

Ejemplo de salida

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 de si esto capta aptitude o no. No parece recoger las instalaciones de la aplicación de escritorio del software Ubuntu.

    
respondido por el s1037989 04.02.2017 - 19:48
8

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.

    
respondido por el txwikinger 16.08.2010 - 21:42
5

Como varias personas han comentado, apt-mark showmanual parece tener errores (y lo reporté como error 727799 ). Cuando lo estoy usando, en realidad informa muchas cosas que ni siquiera está conectado en / var / lib / apt / extended_states (donde se supone que se debe almacenar) y apt-get no está registrando cosas como instaladas en / var / lib / apt / extended_states (solo en / var / lib / dpkg / status). La secuencia de comandos de python de txwikinger anterior se basa directamente en / var / lib / apt / extended_states, pero si la 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 era una lista muy corta de 5 elementos que tampoco parece ser precisa.

    
respondido por el cluelesscoder 27.10.2013 - 01:28
4

Para obtener una lista de todos los paquetes (no instalados, instalados por el usuario o instalados por defecto en todos los PPA), apt emplea 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-installed para mostrar los paquetes que explícitamente instaló un comando, 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 solamente, y para obtener información adicional sobre ellos, como la versión y la arquitectura compatibles (x86, x86_64, amd64, todo, etc.)

    
respondido por el Aalok 07.02.2017 - 15:01
1

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

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

Nota: Esto es más una ilustración de lo genial que parecerá desvelar comandos masivos de bash a todos sus amigos.

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

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

  • Primero consultamos dpkg para obtener una lista de paquetes que están instalados.
  • Filtramos 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
  • rockeamos porque podemos.
respondido por el Oli 16.08.2010 - 19:41
1

Si nadie te da una buena respuesta con un comando apr-something, puedes hacerlo de la manera más 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 Autoinstalado: 0 en la segunda línea. No se borra.

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

    
respondido por el Javier Rivera 16.08.2010 - 19:44
1

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

# List of all packages currently installed
current=$(dpkg -l | awk '{print }' | 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/.* - (.*)//')
    date=$(date -r /var/lib/dpkg/info/$pack.list)

    echo "# $desc"
    echo "# $date"
    echo "sudo apt-get install $pack"
    echo -e ""
done
    
respondido por el dufferZafar 31.05.2015 - 22:28
0

Me gustaría dar una solución GUI.

  1. Abrir Synaptic Package Manager

  2. Ir a Status

  3. Haz clic en Installed (manual)

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

Lamentablemente, no pude encontrar ninguna opción en Custom Filters para averiguar si un paquete foobar se instaló de forma manual o automática.

Si el paquete está bajo Installed pero no debajo de Installed (manual) , entonces se instaló automáticamente. Si el paquete está bajo Installed (manual) , entonces se instaló manualmente.

    
respondido por el blueray 28.05.2018 - 17:39
-1

Esto mostrará una lista de 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.* " |
  sed -r "s/Commandline: apt-get//;s/ //" |
  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
}
    
respondido por el wieczorek1990 08.10.2014 - 15:39

Lea otras preguntas en las etiquetas