Me gustaría obtener una lista de paquetes instalados manualmente por apt
o aptitude
y poder averiguar si un foobar
paquete se instaló manual o automáticamente. ¿Hay alguna forma ordenada de hacerlo desde la línea de comandos?
Me gustaría obtener una lista de paquetes instalados manualmente por apt
o aptitude
y poder averiguar si un foobar
paquete se instaló manual o automáticamente. ¿Hay alguna forma ordenada de hacerlo desde la línea de comandos?
Respuestas:
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:
sed
elimina el espacio en blanco restante al final de la línea.Otras posibilidades no funcionan tan bien:
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.apt-mark showauto
lugar de /var/log/installer/initial-status.gz
. apt-mark
por 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é).
/var/log/installer/initial-status.gz
falta. ¿También quiero saber si esto depende del marcado de los apartamentos manual
o no?
showmanual
comando (abajo). Y use comm
para comparar las dos listas (ordenadas). El showmanual
resultado me dio 1.840 paquetes únicos más de apt-mark showmanual
no mostrados por este método. NO los paquetes fueron exclusivos de la salida de este comm
comando. 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.
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;)]
En las versiones más recientes del paquete apt, también existe el comando apt-mark
apt-mark showmanual
linux-image-3.11.0-*-generic
etc. como manual
linux-image-3.13.0-24-generic
es manual pero el actual linux-image-3.13.0-27-generic
es 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
apt-get autoremove
. Esto definitivamente no es lo que quieres.
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
grep 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 aptitude
o no. Parece que no recoge las instalaciones de la aplicación de escritorio Ubuntu Software.
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.
aptitude search
muestra TODOS los paquetes, no solo los que se instalan manualmente (supongo que eso es lo que quería el OP)
aptitude search '!~M ~i'
y enumera 1043 paquetes. No hay forma de que haya instalado tantos paquetes manualmente.
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.
sys.exit(1)
sin import sys
puede provocar un error en las versiones más recientes de python. Ya sea import sys
o uso exit(1)
.
Para obtener una lista de todos los paquetes (no instalados, instalados por el usuario o instalados de manera predeterminada, en todos los PPA), apt
utilice 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 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.)
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.
sys.exit(1)
sin import sys
puede provocar un error en las versiones más recientes de python. Ya sea import sys
o uso exit(1)
.
Me gustaría dar una solución GUI.
Abierto Synaptic Package Manager
Ir Status
Hacer clic Installed (manual)
Le dará la lista de paquetes instalados manualmente por apt o aptitude.
Lamentablemente, no pude encontrar ninguna opción Custom Filters
para averiguar si un foobar
paquete se instaló manual o automáticamente.
Si el paquete está debajo Installed
pero no debajo Installed (manual)
, se instaló automáticamente. Si el paquete está debajo Installed (manual)
, se instaló manualmente.
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.
apt-get install liferea
y 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 0
lugar de un 1
. Además, debe cambiar su patrón de expresión regular en " foobar$"
lugar de solo foobar
.
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
sort -u
lugar de sort | unique
. Como apt-mark
no 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.
apt-mark
puede mostrar arquitectura para algunos paquetes, pero no para tantos dpkg -l
.
apt-cache search
es lento. Obtener una lista de fechas instaladas por adelantado usando algo como help.ubuntu.com/community/ListInstalledPackagesByDate podría ser más eficiente
Como dijo Li Lo, apt-mark showauto
deberí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?
apt-mark
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)
es adecuadamente mejor;)
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
}