51

On Debian systems (and derivatives):

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

That is, the file /bin/ls belongs to the Debian package named coreutils.

But this only works if the package is installed. What if it's not?

muru
  • 72,889
tshepang
  • 65,642

4 Answers4

67

apt-file

apt-file provides the feature of searching for a package providing a binary (like Debian or Ubuntu), it is not installed by default but in the repositories.

apt-file search <path-to-file>

You may want to update once before searching...

apt-file update 

For example, let's search for the not installed binary mysqldump:

$ apt-file search /usr/bin/mysqldump

mysql-client-5.1: /usr/bin/mysqldump mysql-client-5.1: /usr/bin/mysqldumpslow mysql-cluster-client-5.1: /usr/bin/mysqldump mysql-cluster-client-5.1: /usr/bin/mysqldumpslow

It's also possible to list the contents of a (not-installed) package:

$ apt-file list mysql-client-5.1

mysql-client-5.1: /usr/bin/innochecksum mysql-client-5.1: /usr/bin/innotop mysql-client-5.1: /usr/bin/myisam_ftdump mysql-client-5.1: /usr/bin/mysql_client_test ...

yum

yum has been largely superseded by dnf on modern Fedora/RedHat-based Linux distributions; see below.

yum accepts the command whatprovides (or provides) to search for installed or not installed binaries:

yum whatprovides <path-to-file>

Again, the not installed mysqldump:

$ yum whatprovides /usr/bin/mysqldump

mysql-5.1.51-2.fc14.i686 : MySQL client programs and shared libraries Repo : fedora Matched from: Filename : /usr/bin/mysqldump

mysql-5.1.51-1.fc14.i686 : MySQL client programs and shared libraries Repo : fedora Matched from: Filename : /usr/bin/mysqldump

dnf

dnf has a repoquery subcommand, which you can use similarly to yum whatprovides:

dnf repoquery --whatprovides /path/to/file

For example:

$ dnf repoquery --whatprovides '*/mysqldump'
mariadb-3:10.5.22-1.el9_2.alma.1.x86_64
mysql-0:8.0.36-1.el9_3.x86_64

zypper

zypper's search command can check file lists when used with the -f option.

zypper se -f /bin/mksh
Loading repository data...
Reading installed packages...

S | Name | Summary | Type
--+------+-------------------+-------- | mksh | MirBSD Korn Shell | package

Webpin provides a webbased solution, there is even a script for the command-line.

pkgfile

Available as pkgtools for pacman based systems. Provides a similar search feature like the others above:

$ pkgfile -si /usr/bin/mysqldump

Name : mysql-clients Version : 5.1.54-1 Url : http://www.mysql.com/ License : GPL Depends : libmysqlclient ...

wag
  • 35,944
  • 12
  • 67
  • 51
  • apt-file search protoc, for example, gives over six thousand results. However the results end in the filename, so with grep you can actually find the filename you are looking for: apt-file search protoc | grep 'protoc$'. It works because it filters out anything that ends in "protoc". Of course you should replace "protoc" with whatever you are searching for. – Luc Oct 07 '16 at 17:50
  • https://unix.stackexchange.com/a/191983/235261 – EsmaeelE Apr 10 '22 at 10:01
  • yet another option/variant: apt-file search -x '/mysqldump$' – JJoao Sep 08 '23 at 07:26
7

The standard tool for this is apt-file. Run apt-file update to download the index file. Here's the output:

Downloading complete file ftp://ftp.is.co.za/debian/dists/squeeze/Contents-i386.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 16.6M  100 16.6M    0     0  33191      0  0:08:47  0:08:47 --:--:-- 38951

After that, run apt-file search search_term.

tshepang
  • 65,642
5

If you don't have access to the machine or can't use the commands given in the previous answers, you can also find this out using the Debian package web-based search engine (the second form, "Search the contents of packages").

Bruno
  • 1,133
0

apt-file can produce many results. With its perl regex, it is almost able to perform the task... if only the file was verified to be installed somewhere in $PATH...

apt-file find --regexp "/$COMMAND$" | grep -E "($(tr : '|' <<< "$PATH"))/$COMMAND$""
Paul
  • 210