¿Cómo puedo averiguar qué paquete posee un archivo?

¿Cómo puedo averiguar de qué paquete de Debian proviene un archivo?

Hay varios utilities en Debian que realizan esta tarea; Consulte esta página para obtener una descripción. Voy a mencionar dos de ellos, apt-file y dlocate .

apt-file busca su caché interno, lo que le permite no instalar todos los paquetes que desea buscar. A continuación encontrará una guía más detallada.

dlocate es una alternativa rápida a dpkg -L (el comando que enumera el contenido del paquete), y como tal, busca sólo los paquetes instalados. La búsqueda se realiza por dlocate -S file.name .

También puede buscar paquetes en línea usando el servidor packages.debian.org (la sección Buscar los contenidos de paquetes ).


Instalación y uso de apt-file

Es una buena idea actualizar primero:

 sudo apt-get update 

Vea lo que apt-file es para:

 apt-cache show apt-file 

Instalarlo:

 sudo apt-get install apt-file 

Leer los datos de los repositorios (esto también funciona sin sudo pero crea la caché del usuario entonces, con sudo la caché es a nivel de sistema):

 sudo apt-file update 

Realice la búsqueda. En este ejemplo queremos saber en qué paquete ejecutable xrandr es:

 apt-file search xrandr 

Enumera muchos paquetes con unxrandr , lxrandr.mo o lxrandr.mo . No es muy útil en nuestro caso. Búsqueda más inteligente:

 apt-file search -x /xrandr$ 

( $ Denota final de línea). Ejemplo de salida:

 bash-completion: /usr/share/bash-completion/completions/xrandr x11-xserver-utils: /usr/bin/xrandr 

El primer resultado no parece ejecutable, el segundo sí. Podemos investigar más. Correr:

 apt-cache show x11-xserver-utils 

¡Bingo! Este es el paquete.

 user@host:~$ dpkg-query -S /bin/bash bash: /bin/bash 

Donde bash es el nombre del paquete.

Otra alternativa:

 $ dpkg -S /bin/bash bash: /bin/bash 

En mi Ubuntu por lo menos, ambos parecen estar en el paquete dpkg , por lo que ninguna ventaja real a ninguna específica …

Los archivos generados por la instalación no serán encontrados por dpkg -S , como se menciona en: https://askubuntu.com/a/667227/52975

Por ejemplo, /bin/nc aparece cuando instala el paquete netcat-openbsd .

Pero sobre:

 dpkg -S /bin/nc 

dpkg-query: no path found matching pattern /bin/nc .

Esto ocurre porque /bin/nc es generado por la llamada update-alternatives en el script postinst que se ejecuta después de la instalación.

Funciona así porque otra versión de /bin/nc es proporcionada por el paquete netcat-traditional .

No creo que haya una forma general de encontrar esos archivos generados. En el caso específico de enlaces simbólicos alternativos, sólo podemos seguir el enlace con readlink -f :

 dpkg -S "$(readlink -f /bin/nc)" 

Al no estar familiarizado con Debian, estaba desconcertado cuando intenté esto:

 kearnsp@xubuntuvb:~$ dpkg -S /usr/bin/vncviewer dpkg-query: no path found matching pattern /usr/bin/vncviewer kearnsp@xubuntuvb:~$ 

Un poco de investigación y encontré el paquete:

 kearnsp@xubuntuvb:~$ ls -l /usr/bin/vncviewer lrwxrwxrwx 1 root root 27 May 28 15:49 /usr/bin/vncviewer -> /etc/alternatives/vncviewer kearnsp@xubuntuvb:~$ ls -l /etc/alternatives/vncviewer lrwxrwxrwx 1 root root 20 May 28 15:49 /etc/alternatives/vncviewer -> /usr/bin/xvnc4viewer kearnsp@xubuntuvb:~$ dpkg -S /usr/bin/xvnc4viewer xvnc4viewer: /usr/bin/xvnc4viewer kearnsp@xubuntuvb:~$