¿Cómo obtengo una lista de paquetes obsoletos?

19

Estoy tratando de encontrar una manera de obtener una lista de los paquetes que ya no están disponibles en los repositorios que he habilitado. Esta estación de trabajo ha pasado por varias versiones de Ubuntu y ha agregado y eliminado muchos repositorios de terceros. Me gustaría obtener una lista de software que tengo de estos repositorios eliminados, para poder limpiarlo o volver a agregar los repositorios apropiados.

Sean
fuente

Respuestas:

23
aptitude search '~o'

Aptitude tiene algunas búsquedas muy poderosas disponibles. Desafortunadamente, la sintaxis es un poco difícil de manejar y tienes que cavar más allá de la página de manual para encontrar la documentación, pero vale la pena.

apt-show-version también puede ser útil:

apt-show-versions | grep 'No available version'
estofado
fuente
1
vea un buen artículo sobre paquetes obsoletos aquí: raphaelhertzog.com/2011/02/07/…
Lluís
Otra lista útil es generada porapt-show-versions | grep "newer than version in archive"
Sean
Creo que apt-show-version es el mejor simplemente porque la línea de aptitud es extremadamente contra-intuitiva para recordar. Cada vez que lo necesito tengo que buscarlo en Google / buscarlo / guardarlo / hacer un script / etc.
j riv
6

Para obtener una lista de aplicaciones que no están en un repositorio registrado o PPA, haga lo siguiente:

sudo apt-get install apt-show-versions
apt-show-versions | grep 'No available version'

Eso debería generar texto como este:

app1 1.0.0.14 installed: No available version in archive
app23 0.3.6 installed: No available version in archive
app332 7.0.9377 installed: No available version in archive

Para mí, esto funcionó y mostró tres aplicaciones que instalé usando paquetes DEB y no estaban disponibles en un Repo o PPA.

Sin embargo, recuerde que es imposible verificar todos los programas, solo los que pasaron dpkg. Por ejemplo, algunas aplicaciones se instalan simplemente extrayéndolas en las carpetas correctas, u otras usan un bin o script de instalación independiente. Entonces, la mejor manera es que usted mismo mantenga una lista de aplicaciones que instaló a través de cualquier método que no sea APT.

japzone
fuente
Funciona para todos mis dpkgpaquetes locales instalados. Una excepción Enumera skype-bin, mientras apt-cache policy skype-binque muestra claramente el repositorio de socios canónicos. No estoy seguro de lo que está pasando. Problema multiarch? Todavía +1 para apt-show-versions!
gertvdijk
aptitude llama a estos paquetes 'obsoletos'. Ver cronitis comentario arriba.
Henk Poley
5

Si tiene aptitude instalado, use

aptitude search '?obsolete'

o su forma corta

aptitude search '~o'

Aquí hay una muestra de salida

i A gcc-4.7-base - GCC, the GNU Compiler Collection (base package)
id  libdb4.7     - Berkeley v4.7 Database Libraries [runtime]
i   libudev0     - libudev shared library

El primer carácter de cada línea indica el estado actual del paquete. Los estados más comunes son:

  • p, lo que significa que no hay rastros del paquete en el sistema,
  • c, lo que significa que el paquete se eliminó pero sus archivos de configuración permanecen en el sistema,
  • i, lo que significa que el paquete está instalado, y
  • v, lo que significa que el paquete es virtual.

El segundo carácter indica la acción almacenada que se realizará en el paquete, si corresponde, de lo contrario se muestra un espacio en blanco. Las acciones más comunes son:

  • i, lo que significa que se instalará el paquete,
  • d, lo que significa que el paquete se eliminará, y
  • p, lo que significa que el paquete y sus archivos de configuración se eliminarán.

Si el tercer carácter es A, el paquete se instaló automáticamente.

Para obtener una lista completa de los posibles indicadores de estado y acción, consulte la sección Acceso a la información del paquete en la guía de referencia de aptitudes.

Demis Palma ツ
fuente
1
aptitude search ?obsoletepuede funcionar en bash, pero deberías usaraptitude search '?obsolete'
AB
¿podría agregar algún detalle al analizar la salida?
Élder Geek
¿Es '? Obsoleto' diferente de '~ o'?
Sean
@Sean No, no son diferentes. ~ o es la forma abreviada de? obsoleto de hecho.
Demis Palma ツ
Las comillas son analizadas por el shell. Creo que lo que AB quiso decir es que no debes pasar caracteres extraños sin escapar en la línea de comando porque no sabes qué hará tu caparazón con ellos.
Sean
2

A partir de Ubuntu 19.10 también es posible ejecutar

apt list ?obsolete

para obtener la lista de paquetes obsoletos.

Para cualquier versión, puede usar el siguiente one-liner de Bash:

comm -23 <(dpkg-query -W -f '${db:Status-Abbrev}\t${Package}\n' | grep '^.[^nc]' | cut -f2 | sort) <(apt-cache dumpavail | sed -rn 's/^Package: (.*)/\1/p' | sort -u)

No es necesario instalar paquetes adicionales para esto, además, esto es relativamente rápido. Esto también encontrará paquetes parcialmente instalados (pero no encontrará aquellos que solo tienen archivos de configuración restantes; sin embargo, eso podría cambiarse fácilmente). Nota: esto no importa de qué arquitectura son los paquetes.

Si desea incluir paquetes que tengan instalada una versión diferente de la que está disponible en los repositorios, puede realizar una de las siguientes acciones:

Use apt moderno:

 apt list --installed | awk -F/ '/\[installed,local\]/{print $1}'

Otra opción es correr

ubuntu-support-status --show-unsupported

y lea los nombres de los paquetes en la sección "Ya no se puede descargar:".

jarno
fuente
'apt list --manual-instalado | grep -v cosmic 'muestra falsos positivos. ¡Esta respuesta es mucho mejor!
TamusJRoyce
1
@TamusJRoyce, sí, supongo que ahora después de la edición.
Jarno
1

Más información para investigar.

ubuntu-support-status 
echo "$ (sudo apt-mark showmanual | wc -l) paquetes marcados como 'instalados manualmente'."

... ubuntu-support-status y apt-mark pueden requerir instalación.

Hannu
fuente
No es necesario usar sudocon apt-mark showmanual.
Jarno
ubuntu-support-statusenumera la cantidad de paquetes obsoletos, pero no los nombres de los paquetes.
Jarno
1
Lea la salida deubuntu-support-status --help
Hannu
Oh, gracias por la pista.
Jarno
0

Puede haber una forma más limpia, pero desde la parte superior de mi cabeza puedes hacer

dpkg -l | cut -f 3 -d ' ' > installed
xargs -n 1 --replace=X apt-cache search ^X$ < installed | cut -f 1 -d ' ' > available
diff installed available

Limpie las primeras líneas del installedarchivo: tendrá encabezados.

Bono si alguien puede arreglar mi resaltado de sintaxis ...

Jeff Ferland
fuente
2
Si va a utilizar la salida de dpkg -lpara obtener una lista de paquetes instalados, debe limitar los resultados a líneas con 'i' en la segunda columna, ya que dpkg también enumerará los paquetes que no están instalados (quizás eliminados pero no purgados) . como ejemplo, alterar su primer comando para dpkg -l | grep '^.[^i]' | cut -f 3 -d ' ' que devuelva una lista de paquetes, que NO están instalados. (pero una vez fueron)
estofado
1
Además, apt-cache search someinstalledpackagedevolverá algo incluso si el paquete no está disponible en un repositorio, por lo que no creo que esto funcione en absoluto.
estofado
1
@stew Dejaré esto aquí para ver si alguien llega a conclusiones, pero tu respuesta es definitivamente mucho mejor. +1 a ti
Jeff Ferland el
@stew dpkg -l | grep '^.[^i]' | cut -f 3 -d ' 'también imprime algunas líneas de encabezado.
Jarno
Incluso si esta respuesta funcionara, sería muy lenta ya que se ejecutaría apt-cache searchpara cada paquete por separado.
Jarno
0

Como se mencionó, apt-get search no es un buen método para verificar si un paquete aún está disponible. Adicional he agregado todo a una sola línea:

for i in `dpkg -l | grep '^i' | awk '{ print $2 }'`; do apt-cache show $i > /dev/null || echo $i; done
wof
fuente
Y por quégrep '^i'
AB
@AB buen punto; eso no indica si el paquete está instalado, pero que la acción deseada del paquete debe instalarse. Ver man dpkg-querypara más información.
jarno
Esto es muy lento
jarno
apt-cache showNo es bueno para comprobar si el paquete está disponible. Si deshabilita el repositorio respectivo, y ningún otro repositorio habilitado lo tiene, aún muestra el paquete.
jarno