129

How do I find out what Debian package a file came from?

5 Answers 5

77

To do this without installing any extra packages, run

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

where bash is the package name.


Alternatively, there are several utilites in Debian which perform this task; check this page for a description. I'll mention two of them, apt-file and dlocate.

apt-file searches its internal cache, thus allowing you to not install all the packages you want to search. Below you will find more detailed guide.

dlocate is a fast alternative to dpkg -L (the command that lists package contents), and as so, it searches only installed packages. Search is performed by dlocate -S file.name.

Also you can search packages online using packages.debian.org server (the Search the contents of packages section).


Installing and using apt-file

It's a good idea to update first:

sudo apt-get update

See what apt-file is for:

apt-cache show apt-file

Install it:

sudo apt-get install apt-file

Read data from repositories (this works also without sudo but creates user's cache then; with sudo the cache is system-wide):

sudo apt-file update

Perform search. In this example we want to know in which package xrandr executable is:

apt-file search xrandr

It lists many packages with unxrandr, lxrandr.mo or source_lxrandr.py. Not very useful in our case. More clever search:

apt-file search -x /xrandr$

($ denotes end of line). Example output:

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

The first result doesn't look like executable, the second one does. We can investigate further. Run:

apt-cache show x11-xserver-utils

Bingo! This is the package.

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

Where bash is the package name.

3
  • 8
    This answer is far better than the accepted one!
    – Bex
    Oct 23, 2018 at 6:52
  • 1
    Correct. It's unfortunate that the "accepted answer" gets a green checkmark, which is a mark that also conveys "correct answer". In this case, the accepted answer misses on dpkg-query -S AND it sends you down the wrong path of installing optional packages.. Sep 13, 2019 at 18:56
  • I've updated the accepted answer to include this "dpkg-query -S" approach Aug 20, 2020 at 10:56
48

Another alternative:

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

On my Ubuntu at least, both seem to be in the dpkg package, so no real advantage to any specific one...

20

Installation generated files will not be found by dpkg -S, as mentioned at: https://askubuntu.com/a/667227/52975

For example, /bin/nc appears when you install the package netcat-openbsd.

But upon:

dpkg -S /bin/nc

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

This happens because /bin/nc is generated by the update-alternatives call in the postinst script that gets run after installation.

It works like this because another version of /bin/nc is provided by the netcat-traditional package.

I don't think there is a general way of finding such generated files. In the specific case of alternative symlinks, we can just follow the link with readlink -f:

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

Not being familiar with Debian, I was baffled when I tried this:

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

A bit of investigation and I found the package:

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:~$ 

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .