Encuentra todos los paquetes instalados por el usuario

38

¿Hay alguna forma de obtener una lista de todos los paquetes instalados por el usuario en un sistema Ubuntu, es decir, los paquetes que se instalaron sobre los paquetes instalados por defecto?

(La idea es obtener una lista completa que pueda usarse para instalar los mismos paquetes en una instalación limpia de Ubuntu)

Rabarberski
fuente

Respuestas:

15

Mira estos archivos,

  1. ' /var/log/installer/initial-status.gz' - su instalación principal
    • esta fecha de archivo sería su fecha de instalación (creo)
    • ' /var/log/dpkg.log' actualizar la línea de tiempo (esto es lo que quieres)
    • ' /var/log/apt/term.log' - cosas aptactualizadas en su sistema
    • ' /var/cache/apt/archives/'contendrá los debpaquetes descargados para la instalación

Actualización: utilice los siguientes dos pasos para obtener una lista exacta de las nuevas instalaciones:

  1. ejecutar: grep -w install /var/log/dpkg.log > full-list.log
  2. Mire las líneas más allá de la /var/log/installer/initial-status.gzmarca de tiempo

Como desea obtener una instalación limpia en otro sistema con estos paquetes, incluso puede copiar los archivos 'deb' de la ruta 'caché / apt / archives' a los de la nueva instalación e instalarlos de una vez (sin descargarlos) otra vez ellos).

nik
fuente
Gracias por el consejo. Es útil, aunque estaba buscando más un solo comando para obtener esta lista. cat /var/log/dpkg.log | grep 'instalar' parece venir cerca, si no hago caso de los elementos instalados hasta la fecha de instalación / hora
Rabarberski
Agregar una razón para el voto negativo ayudaría a comprender un problema en la respuesta, si hay una. También conduciría a mejores respuestas en el futuro.
nik
Oeps, el voto negativo fue accidentalmente mío. Ya había votado tu respuesta. Cuando traté de marcar su respuesta como 'final', hice clic mal y presioné la flecha hacia abajo. Al intentar deshacerlo, apareció el mensaje: "Vota demasiado viejo para cambiarlo, a menos que se edite esta respuesta". Lo siento, nik, tanto por el voto negativo como por la confusión. :-(
Rabarberski
@Rabarberski, bueno, eso sucede ... sin daño.
nik
no funciona si / var / log / installer no existe, como en una instalación de servidor. También tendría sentido agregar NÚMEROS DE VERSIÓN si está hablando de "Ubuntu", ¿qué Ubuntu?
8

Solo para sonreír, armé un solo mensaje (aquí dividido para mayor claridad) que descubre los paquetes instalados manualmente , excluyendo los instalados inicialmente y cualquier paquete instalado automáticamente:

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) \
  )

Esto funciona tanto en bashcomo en zsh.

geekosaur
fuente
Esto funciona casi perfectamente, excepto que parece imprimir un montón de bibliotecas instaladas durante la instalación inicial. Hay un montón de libtiff, libxcbetc. que no instalé yo mismo. Esta respuesta: superuser.com/a/105000/24349 se encarga de eso ordenando según el tiempo de instalación y eliminando todo antes del tiempo de instalación del sistema. ¡Excelente (ab) uso de shell!
haxney
3

Según la información anterior, escribí un breve script de Python para enumerar los paquetes que se instalaron manualmente. Ver este enlace .

Siéntase libre de usarlo, aunque no asumo ninguna responsabilidad por ello. Sin embargo, los comentarios y sugerencias son siempre bienvenidos.

Kazark
fuente
¡Brillante! Tarda un tiempo en ejecutarse, ¡pero es la única solución que he encontrado que hace exactamente lo que necesito!
haxney
2
Desafortunadamente, el enlace ahora está roto (muestra un rastreo de python) que demuestra el valor de poner la respuesta aquí (especialmente para un "script corto de python"
David Ljung Madison Stellar
Encontré un repositorio de github con el script: github.com/gerjantd/bin/blob/master/… Haga clic en 'raw' para descargar y ejecute con 'python list_manually_installed_packages.py'
David Ljung Madison Stellar
2
El enlace github ahora también está roto ...
Suzana
1

suponiendo que tiene un historial consistente y aptitudes de uso:

history | grep -e "^..... aptitude install"

enumeraría solo los paquetes que instaló con aptitude install ... duh

Fehlersturm
fuente
1

Este es un trabajo de pirateo, pero funciona completamente.

Primero, vaya a http://releases.ubuntu.com/maverick/ (o cualquier versión de Ubuntu que esté usando) y tome la *.manifest fileque está asociada con la versión de Ubuntu que está usando.

Luego, ejecute el siguiente script (reemplazando <manifest file>, corchetes angulares y todo, con la ruta al archivo que descargó. Siempre puede agregar > outputal final para hacer un volcado de archivo.

diff --suppress-common-lines <(sed 's/ .*//' <manifest file>) <(dpkg --get-selections | sed 's/[ \t].*//') | grep '>' | sed 's/[>] //'
Arthur Summers
fuente
1

Gracias geekosaur, buen código. Lo usé pero me llevó un tiempo descubrir cómo hacerlo funcionar. Así es como lo hice en Ubuntu 11.10: funciona en el terminal bash:

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) \
  ) > user-installed-packages

Luego, para agregar una pestaña, \ty installen cada línea:

sed 's/$/\tinstall/' user-installed-packages >uip

Luego en la nueva máquina:

sudo dpkg --set-selections < uip

Y para instalar los paquetes:

sudo apt-get dselect-upgrade
jrussell88
fuente
0

Otra forma de hacerlo es determinando qué se ha instalado en función de sus "tareas" que determinan los paquetes base para instalar de acuerdo con sus necesidades iniciales.

tasksel --list-tasks

Por lo menos lo tendrías server. Sin embargo, puede elegir tener más. Para cada una de esas tareas que ha instalado, puede obtener una lista de paquetes que están instalados, el siguiente comando lo hace todo en una línea (desglosado para mayor claridad) para los que he elegido en mi instalación:

(tasksel --task-packages server ; \
 tasksel --task-packages openssh-server ; \
 tasksel --task-packages lamp-server) | sort | uniq

Un enfoque genérico de lo anterior sería:

(for a in $( tasksel --list-tasks | grep "^i" | awk '{ print $2 }' ) ; \
 do tasksel --task-packages $a; done) | sort | uniq

Ahora use apt-cache depends --installed -i --recurse <packagename> | grep -v "^ "para obtener una lista de dependencias utilizadas por todos los paquetes definidos en la tarea. Esto se puede hacer en una línea de la siguiente manera

apt-cache depends --installed -i --recurse \
     $(for a in $( tasksel --list-tasks | \
                   grep "^i" | \
                   awk '{ print $2 }' ) ; \
       do tasksel --task-packages $a; done) | grep -v "^ " | sort | uniq

A continuación se enumeran todos los paquetes que están instalados en su sistema (sin incluir las dependencias).

dpkg --get-selections | grep "[[:space:]]install" | awk '{print $1}'

Ahora use el commcomando para encontrar los que están en la segunda lista solamente (es decir, ignore los que están en ambos archivos y solo en el primer archivo)

comm -13 <(apt-cache depends --installed -i --recurse \
              $(for a in $( tasksel --list-tasks | \
                            grep "^i" | \
                            awk '{ print $2 }' ) ; \
                do tasksel --task-packages $a; done) | grep -v "^ " | sort ) \
         <( dpkg --get-selections | grep "[[:space:]]install" | \
            awk '{print $1}' | sort)
Arquímedes Trajano
fuente