Buscar paquetes instalados desde un cierto repositorio con aptitude

Estoy en busca de algo análogo a esta pregunta: Zypper: ¿Cómo puedo mostrar todos los paquetes de un cierto repositorio?

Ya que estoy en Ubuntu, necesito una solución basada en aptitudes: ¿Cómo puedo obtener una lista de paquetes instalados de un cierto repositorio?

Utilizando aptitude, para buscar paquetes instalados fuera de la rama estable, puede utilizar:

aptitude search "?narrow(?installed,?not(?archive(stable)))" 

Para ver las versiones, así como los nombres de los paquetes (y en lugar de las descripciones), puede utilizar el comando con la opción format ( -F para abreviar), como se indica a continuación.

 aptitude search -F "%p %V %v" "?narrow(?installed,?not(?archive(stable)))" 

Para obtener más formatos, eche un vistazo a la página de manual (aquí está la documentación con las opciones disponibles ).

Eso funciona, por ejemplo, en Debian si instaló paquetes fuera de Squeeze (por runing, por ejemplo, apt-get install -t sid package-name .

Puede ver de dónde viene un paquete instalado a través apt-cache policy , el uso es el siguiente:

 apt-cache policy <package-name> 

Por ejemplo, mi paquete python-numpy genera la siguiente salida:

 $ LANG=C apt-cache policy python-numpy python-numpy: Installed: 1:1.6.2-1 Candidate: 1:1.6.2-1.2 Version table: 1:1.7.0-1 0 1 http://ftp.es.debian.org/debian/ experimental/main amd64 Packages 1:1.6.2-1.2 0 500 http://ftp.es.debian.org/debian/ sid/main amd64 Packages *** 1:1.6.2-1 0 100 /var/lib/dpkg/status 1:1.4.1-5 0 990 http://ftp.es.debian.org/debian/ squeeze/main amd64 Packages 990 http://ftp.de.debian.org/debian/ squeeze/main amd64 Packages 

Eso significa que soy una versión detrás de la rama actual de sid / main, así que tengo una versión de old-sid instalada. Veo que no tengo el estable porque todavía es 1.4.1-5 , y actualmente estoy en 1.6.2-1 .

En el momento de la presentación este paquete ya estaba actualizado:)

Después de leer la página de información de aptitude y una docena de intentos, finalmente conseguí esto:

 aptitude search '?narrow(?installed,?not(?archive(testing)) ?archive(unstable))' 

o equivalente) :

 aptitude search '~S ~i (!~Atesting ~Aunstable)' 

Se buscará paquetes instalados desde archivos inestables de cualquier repositorio. Tienes que filtrar paquetes de tu archivo predeterminado (prueba en el ejemplo anterior).

Si desea filtrar paquetes instalados desde http://www.debian-multimedia.org/unstable:

 aptitude search '~S ~i (!~Atesting ~Aunstable ?origin("Unofficial Multimedia Packages")) 

Editar: "Archivo", "origen", etc. se deducen del archivo Release del repositorio. Desafortunadamente no todas las herramientas pueden mirar todas esas líneas y usan diferentes sintaxis para ellos. Puede encontrar esos archivos como /var/lib/apt/lists/*Release . O simplemente escribe apt-cache policy para obtener una descripción. Apt-cache cambió su formato de salida: las versiones posteriores usan el estilo apt_preferences.

  • Suite: o Archive: (nombre antiguo!)
    • Aptitude search ?archive(___) o ~A___
    • Formato de aptitud: %t
    • Apt_preferences: release a=___
    • Ejemplos de Ubuntu: natty-backports , trusty-security , stable
  • Origin:
    • Búsqueda de aptitudes ?origin(___) o ~O___
    • Formato de aptitud: n / a
    • Apt_preferences: release o=___
    • Ejemplos de Ubuntu: Canonical , Google, Inc. , LP-PPA-dockbar-main , Ubuntu
  • Todas las otras líneas
    • Aptitud: n / a

Examine la etiqueta de origen (como o = Debian ) para cada uno de sus repositorios actuales:

 apt-cache policy | sed -n 's/.*o=\([^,]\+\).*/\1/p' | uniq 

Luego busque paquetes de (o no de) un origen particular:

 aptitude search "?installed?origin(Debian)" 
 aptitude search "?installed?not(?origin(Debian))" 

Esto no es adecuado para una auditoría de seguridad porque se basa en cada repositorio para proporcionar su propia información de origen, pero puede ser útil para solucionar el origen de paquetes que están presentes en varios repositorios.

Para mayor completitud: En los sistemas Ubuntu también puede utilizar Synaptic para esta tarea. En la columna izquierda puede filtrar los paquetes por su origen.

He encontrado esto:

 aptitude search "?origin (<repository>) ?installed" 

También puede encontrar una lista de términos de búsqueda compatibles con "aptitude search" aquí .

En primer lugar, busque los archivos apropiados para el repositorio de interés en / var / lib / apt / lists. Debería ser posible hacerlo mediante programación, pero no he tenido que hacerlo.

Utilizando Google Chrome como ejemplo, pruebe lo siguiente:

 SEARCH_PATTERN=dl.google.com_linux_chrome # adjust to suit your needs for PKG in $( grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages | sed 's/^Package: //' ) do if dpkg -s "${PKG}" 2> /dev/null 1> /dev/null then echo ${PKG} fi done 

Y obtengo la salida:

 google-chrome-stable 

Dpkg -s devuelve 0 si el paquete está instalado y no es cero en caso contrario. Para fines de referencia futura, la producción de

 grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages 

estaba

 Package: google-chrome-beta Package: google-chrome-stable Package: google-chrome-unstable