Encuentra paquetes instalados desde cierto repositorio con aptitude

Respuestas:

17

Usando aptitude, para buscar paquetes instalados fuera de la rama estable, puede usar:

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 usar el comando con la opción de formato ( -Fpara abreviar), de la siguiente manera.

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

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

Que funciona por ejemplo, en Debian Si ha instalado paquetes Squeeze exterior (por runing, por ejemplo, apt-get install -t sid package-name.

Puede ver de dónde proviene un paquete instalado apt-cache policy, el uso es el siguiente:

apt-cache policy <package-name>

Por ejemplo, mi paquete python-numpy presenta el siguiente resultado:

$ 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 estoy una versión detrás de la rama actual de sid / main, así que tengo instalada una versión antigua de sid. Veo que no tengo el estable porque todavía lo es 1.4.1-5, y actualmente estoy en 1.6.2-1.

Al momento de la presentación, este paquete ya estaba actualizado :)

ssice
fuente
Prefiero ?any-version(), porque ~narrow(pat1, pat2)es lo mismo ?any-version(pat1 pat2)y es compatible ?any-version(pat1 pat2 pat3)sin parecer estúpido.
Robert Siemer
18

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

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

o equivalente) :

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

Buscará paquetes instalados desde archivos inestables de cualquier repositorio. Debe filtrar los paquetes de su archivo predeterminado (prueba en el ejemplo anterior).

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

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

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

  • Suite:o Archive:(nombre antiguo)
    • búsqueda de aptitud: ?archive(___)o~A___
    • formato de aptitud: %t
    • apt_preferences: release a=___
    • Ubuntu ejemplos: natty-backports, trusty-security,stable
  • Origin:
    • búsqueda de aptitud: ?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 demás líneas
    • aptitud: n / a
Christophe
fuente
15

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 que cada repositorio proporciona su propia información de origen, pero podría ser útil para solucionar el origen de los paquetes que están presentes en múltiples repositorios.

Anónimo
fuente
2
Tus aptitude searchpatrones no son buenos. - Seleccionan de esta manera "enumerar los paquetes donde está instalada una versión, y cualquier otra versión existe en Debian" o "alguna versión instalada, y al menos una versión de ese paquete disponible en una versión que no sea Debian". - Lo que buscamos es "la versión instalada es de Debian (o no)". Esto tiene que hacerse con ?narrow()o ?any-version().
Robert Siemer
Confirmado. He instalado nemo-filerollerdesde linuxmint, pero también existe en Debian. Entonces aparece en la lista, porque está instalado y existe en algún lugar de Debian.
Boldewyn
6

Para completar: en los sistemas Ubuntu también puede usar Synaptic para esta tarea. En la columna izquierda puede filtrar paquetes por su origen.

Boldewyn
fuente
Estaba tratando de hacer esto y encontré esta publicación SU a través de Google, no puedo creer que haya pasado por alto Synaptic, ¡gracias!
David Claridge
@RobertSiemer Puede que se te haya pasado por alto que lo acepté después de dos días sin respuesta suficiente y antes de que ninguna de las otras respuestas apareciese. Lo acepté porque resolvió mi problema. También voté por todas las respuestas posteriores , pero, perdón, nunca cambié el estado de aceptación. También notará en las preguntas frecuentes de este sitio, que no he obtenido ninguna ganancia de reputación de este movimiento, donde de hecho he perdido 2 repeticiones por no aceptar la respuesta de otra persona . Por lo tanto, dé un paso atrás en el futuro antes de juzgar las decisiones de alguien en público y reconsiderar las posibles causas.
Boldewyn
2

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í .

max
fuente
¿Por qué necesitas ejecutar esto sudo? Me parece que esto también funciona sin ejecutarlo como root.
Andre Holzner
No necesita ejecutarse con sudo
Kurtis Nusbaum
Como comenté en la respuesta de @Anonymous, esto no tiene el efecto deseado.
Robert Siemer
2

Primero, encuentre los archivos apropiados para el repositorio de interés en / var / lib / apt / lists. Debería ser posible hacer esto mediante programación, pero no he necesitado hacerlo.

Usando google chrome como ejemplo, intente esto:

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 de lo contrario no es cero. Para fines de referencia futura, la salida de

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

fue

Package: google-chrome-beta
Package: google-chrome-stable
Package: google-chrome-unstable
coreyh
fuente
... usa esto aptitud?
Robert Siemer
2
@RobertSiemer ¿Cómo es relevante? La pregunta, suponiendo un dominio razonable del inglés, es cómo encontrar la fuente de los paquetes que se instalaron con aptitude . No hay requisito de que la solución use aptitude.
Auspex
@Auspex, creo lo contrario. - Y no te preocupes, mi dominio del inglés superó "razonable" hace un par de años.
Robert Siemer
2
Aparentemente no ...
Auspex
2
@Auspex: ¿estás tratando de provocarme? Lo contrario es cierto: la pregunta es pedir una solución basada en aptitude, no para paquetes instalados con aptitude.
Robert Siemer
0

Las otras respuestas son realmente incorrectas, porque el parámetro to ?archive()es una expresión regular. Entonces ?archive(stable)coincide con ambos stabley unstable. Para excluir solo stablenecesita anclar el patrón regex:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^stable$")))'

Para excluir múltiples repositorios:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^(xenial|xenial-updates)$")))'

También tenga en cuenta que algunos paquetes pertenecen a múltiples repositorios, por ejemplo xenial-security,xenial-updates. ?archive()evalúa el patrón regex contra cada repositorio individualmente, por ?archive("^xenial-updates$")lo que coincidirá con cualquier paquete que pertenezca xenial-updates, incluso si pertenece a otros repositorios también.

Animismo
fuente