¿Cómo encuentro el paquete que proporciona un archivo?

468

Pregunta bastante simple: ¿hay algún comando de shell (o método GUI) que pueda usar, dada la ruta a un archivo en mi sistema, me dice qué paquete lo puso allí? Suponiendo que el archivo en realidad proviene de un paquete, es decir.

Pregunta adicional: ¿qué pasa si es un archivo que no está instalado en mi sistema? ¿Existe, por ejemplo, un sitio web que me permita buscar un archivo y ver qué paquetes, si los hay, lo proporcionan?

David Z
fuente
66
Siempre me he preguntado esto: sé que con YUM puedes hacer yum lo que proporciona <filepath> / <filename> pero nunca he encontrado una alternativa a eso en Aptitude que no sea el sitio web de Paquetes
Marco Ceppi
Lo mismo en SU: superuser.com/questions/10997/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Ninguna de las respuestas aquí cubre el Provides:mecanismo. Más detalladamente, un comando como mailxo sendmailno está incluido como binario en ningún paquete; en cambio, varios paquetes instalan sus propios binarios y luego hacen que algunos de ellos estén disponibles con un nombre "canónico" a través de /etc/alternatives. Consulte también askubuntu.com/questions/366135/…
tripleee el

Respuestas:

439

Puede usar el dpkgcomando para averiguar qué paquete instalado posee un archivo:

De man dpkg:

-S, --search nombre-búsqueda-patrón-búsqueda ...
                  Busque un nombre de archivo de los paquetes instalados.

Ejemplo:

$ dpkg -S /bin/ls
coreutils: /bin/ls

Puede buscar con una ruta completa o solo con el nombre del archivo.

Si desea buscar archivos que aún no están instalados en su computadora, puede usar la Búsqueda de paquetes de Ubuntu

Ressu
fuente
55
Recomiendo usar dlocate, que se actualiza diariamente para búsquedas más rápidas.
Daniel T Chen el
20
Sugerencia: si no conoce la ruta completa, pero solo el nombre del comando, use whichpara encontrar el programa:dpkg -S `which firefox`
Lekensteyn
1
@DanielTChen, pero dlocatepuede no hacer el trabajo, si la base de datos de dlocate no está actualizada. Tienes que llamar sudo update-dlocatedbpara actualizarlo.
jarno
2
Si dpkgla ruta exacta no devuelve nada (por ejemplo dpkg /usr/bin/java), intente solo el nombre del ejecutable (por ejemplo dpkg java).
Dan Dascalescu
2
También se puede utilizar realpathpara resolver los enlaces simbólicos, como esto: dpkg -S $(realpath $(which <command>)).
Lars Nyström
237

El apt-filecomando puede hacer esto por usted desde la línea de comando. Lo uso con frecuencia cuando construyo paquetes desde la fuente. Para los archivos proporcionados por paquetes que ya están instalados en su sistema, apt-cachees otra opción.

Para instalar apt-file, haga:

sudo apt-get install apt-file

Luego, debe actualizar su base de datos:

apt-file update

Y, finalmente, busque el archivo:

$ apt-file find kwallet.h
kdelibs5-dev: /usr/include/kwallet.h
libkf5wallet-dev: /usr/include/KF5/KWallet/kwallet.h

Sin embargo, una forma mucho más amigable es usar el sitio web de Búsqueda de paquetes de Ubuntu . Tienen la opción de "buscar el contenido de los paquetes" para un nombre de archivo específico.

jbowtie
fuente
21
En mi opinión, esta debería ser la respuesta aceptada. Pero en respuesta a Ubuntu Packages Search , podría argumentar que un programa shell así de simple es extremadamente amigable y fácil de recordar (una vez que lo sabes). Si usa dpkg, apt-get o aptitude como herramientas estándar, ¡no hay nada amigable en activar Chrome para navegar por Internet!
user2097818
3
@ user2097818 La razón por la que esta no es la respuesta aceptada es que mi pregunta principal está restringida a los archivos del sistema y los paquetes que están instalados. apt-filea menudo encuentra falsos positivos, es decir, paquetes que no están instalados. Por supuesto, esta respuesta es excelente para la "pregunta extra".
David Z
3
Para aquellos del lado Redhat del mundo, apt-file search <>es el análogo más cercano a dnf/yum whatprovides <>.
incipiente
Alias apt-file findcomo hace apt-findmucho tiempo y es realmente útil! Por cierto, las últimas versiones requieren root para apt-file update.
val
43

También hay apt-file para buscar archivos en paquetes que no están instalados. Por ejemplo:

apt-file list packagename
ptman
fuente
13

Te refieres a qué paquete y no a qué aplicación. La aplicación es su administrador de paquetes, por ejemplo Software Center.

Utilizando dpkg:

dpkg -S /usr/lib/tracker/tracker-store
dpkg -S tracker-extract
dpkg -S tracker-miner-fs

Ejemplo

% dpkg -S /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store

Utilizando apt-file:

apt-file search /usr/lib/tracker/tracker-store

o también posible:

apt-file search --regex /tracker-extract$
apt-file search --regex /tracker-miner-fs$

Ejemplo

% apt-file search /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store

O en línea aquí , en la sección Search the contents of packages.

ingrese la descripción de la imagen aquí

Ejemplo

ingrese la descripción de la imagen aquí

AB
fuente
Te refieres a qué paquete y no a qué aplicación. La aplicación es su administrador de paquetes, por ejemplo, el Centro de software. Bueno. ¡Gracias! :)
ReyKev
¡Gracias por toda la ayuda! Sin embargo, ninguna de estas sugerencias me ayudó a encontrar qué paquete instaló esta / estas aplicaciones. Todas las búsquedas solo conducen a "Rastreador". Sin embargo, sospechaba que era el dosel de Enthoughts. El EULA de esa milla de largo me recordó mi antiguo aturdimiento de Microsoft Windows, con el que estoy muy contento de no estar más involucrado. Vi que Tracker se instaló ayer, así que, como root, lo eliminé, junto con Canopy de Enthoughts, y todos los problemas están resueltos. Realmente te agradezco toda tu ayuda. Es una gran cosa tener ese apoyo. ¡Gracias de nuevo! Kevin
ReyKev
4

Esta es una extensión de la excelente respuesta de Alexx Roche . Traté de hacer una edición de esa respuesta, pero fue rechazada (aunque no por Alexx)


Intentaba localizar lo que estaba instalado whichen mi sistema. Después de un poco de trabajo creé/usr/local/bin/apt-whatprovides

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY="$(realpath $(which $@) 2>/dev/null)"
[ -z "$BINARY" ] && BINARY="$@"
echo Searching for $BINARY
PACKAGE="$(apt-file search $BINARY|grep -E ":.*[^-.a-zA-Z0-9]${BINARY}$")"
echo "${PACKAGE}"

Aunque para la mayoría de las COSAS que están instaladas puedes usar:

apt-file search $(realpath $(which THING)) | grep 'THING$'

Para las COSAS que no están instaladas, puede usar:

apt-file search THING | grep '/THING$'

El apt-whatprovidesscript funciona para archivos que están y no están en su sistema. Por ejemplo, mi sistema carecía digpero tenía pingesto, lo que resultó:

pi@raspberrypi:~ $ apt-whatprovides ping
Searching for /bin/ping
inetutils-ping: /bin/ping
iputils-ping: /bin/ping

pi@raspberrypi:~ $ apt-whatprovides dig
Searching for dig
dnsutils: /usr/bin/dig
epic4: /usr/share/epic4/script/dig
epic4-help: /usr/share/epic4/help/8_Scripts/dig
knot-dnsutils: /usr/bin/dig

Observe que Searching fores una ruta completa para ping(instalado) y solo el nombre binario para digno instalado. Esto me ayudó a descubrir que necesitaba instalar dnsutilssin tener que ir a buscar https://packages.ubuntu.com/#search_contents

Bruno Bronosky
fuente
¡Esta es una respuesta tan buena que debería eliminar la mía!
Alexx Roche
3

Intentaba localizar lo que estaba instalado whichen mi sistema. Después de un poco de trabajo creé apt-whatprovides

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY=$(realpath $(which $@))
PACKAGE=$(apt-file search $BINARY|grep -E ":\s*${BINARY}$")
echo ${PACKAGE%:*}

Aunque para la mayoría de las COSAS puedes usar

apt-file search $(realpath $(which THING))|grep 'THING$'
Alexx Roche
fuente
1
Alexx, me encanta esta respuesta. Espero que no te importe mi edición. Hice que también funcione para archivos que no están instalados en el sistema. Hice una copia de seguridad en gist.github.com/RichardBronosky/… y crearé mi propia respuesta si la revierte / rechaza.
Bruno Bronosky
Actualización: se siente pegajoso copiar esta respuesta y hacer cambios sutiles, pero mi edición fue rechazada. Espero que sientas que mantuve la integridad de tu respuesta en la mía .
Bruno Bronosky
Siéntase libre de editar o piratear; cualquier cosa que lo haga mejor para usted (¡por eso agregué la licencia MIT! Ni siquiera necesito crédito).
Alexx Roche
2

Una razón por la que podría tener que hacer esto es si está compilando software que ya tiene un paquete ubuntu, puede ejecutarlo apt-get build-dep $PACKAGENAME. Eso instalará todos los paquetes que necesita compilar $PACKAGENAME.

Rory
fuente