How do I find the package that provides a file?

  • Simple enough question: is there some shell command (or GUI method) I can use that, given the path to a file on my system, tells me what package put it there? Assuming the file did in fact come from a package, that is.

    Bonus question: what if it's a file that isn't installed on my system? Is there, say, a website that will let me look up a file and see what packages, if any, provide it?

    I've always wondered this myself - I know with YUM you can do yum whatprovides / but I never really have found an alternative to that in Aptitude other than the Packages website

    None of the answers here actually cover the `Provides:` mechanism. In some more detail, a command like `mailx` or `sendmail` is not included as a binary in *any* package; instead, various packages install their own binaries and then make some of them available under a "canonical" name via `/etc/alternatives`. See also https://askubuntu.com/questions/366135/how-to-search-for-packages-that-provides-a-virtual-package

  • Ressu

    Ressu Correct answer

    10 years ago

    You can use dpkg command to find out which installed package owns a file:

    From man dpkg:

    -S, --search filename-search-pattern...
                      Search for a filename from installed packages.
    

    Example:

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

    You can either search with a full path or with just the filename.

    If you wish to search for files not yet installed on your computer, you can use the Ubuntu Packages Search

    I highly recommend using dlocate, which is updated daily for faster lookups.

    Hint: if you do not know the full path, but just the command name, use `which` to find he program: `dpkg -S \`which firefox\``

    This works for libraries as well, which is particularly handy if you have a binary that won't run because you can inspect it with ldd and use the full library paths to find the packages you are missing.

    @DanielTChen, but `dlocate` may not do the job, if dlocate's database is out of date. You have to call `sudo update-dlocatedb` to update it.

    If `dpkg` the exact path doesn't return anything (e.g. `dpkg /usr/bin/java`), try just the executable's name (e.g. `dpkg java`).

    Also, note that the command may be a sym-link (like to /etc/alternatives), so use the final referenced file instead.

    Like in superuser and in unix.SE, this is the best alternative. Here the alternative if package is not installed. If you get _dpkg-query: no path found matching pattern_ try this `dpkg -S "$(readlink -fn "$(which free)")"` (or a `dpkg -S command` but you'll other things).

    Works but GNU/Linux man page documents `-S` at: `man dpkg-query` (not at `man dpkg`)

    You can also use `realpath` to resolve symlinks, like this: `dpkg -S $(realpath $(which ))`.

  • The apt-file command can do this for you from the command line. I use it frequently when building packages from source. For files provided by packages that are already installed on your system, apt-cache is another choice.

    To install apt-file, do:

    sudo apt-get install apt-file
    

    Then, you need to update it's database:

    sudo apt-file update
    

    And, finally, search the file:

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

    However a much friendlier way is to use the Ubuntu Packages Search website. They have an option to "search the contents of packages" for a specific filename.

    In my opinion this should be the accepted answer. But in response to *Ubuntu Packages Search*, I might argue that a shell program this simple is extremely friendly and easy to remember (once you know it). If you use dpkg, apt-get, or aptitude as your standard tools, there is nothing friendly about firing up Chrome to surf the internet!

    @user2097818 The reason this isn't the accepted answer is that my primary question is restricted to files on the system and packages which are installed. `apt-file` often finds false positives, i.e. packages that aren't installed. Of course this answer is great for the "bonus question".

    For those from the Redhat side of the world - `apt-file search <>` is the closest analog to `dnf/yum whatprovides <>`.

    I aliased `apt-file find` as `apt-find` long time ago and it's really handy! Btw, latest versions require root for `apt-file update`.

    I guess the question is why in the world is this functionality not built into `apt`, `apt-get`, or one of the other default `apt-*` programs. It seems like key piece of any package manager's search capabilities.

    After running the `sudo apt install apt-file` on Ubuntu 18, I get `Package apt-file is not available, but is referred to by another package.`

  • There's also apt-file for looking up files in packages that aren't installed. For example:

    apt-file list packagename
    
  • You can search the contents of packages included in the various Ubuntu releases on the Ubuntu Packages website. Look under the heading "Search the contents of packages".

    For example, here are the search results for libnss3.so in lucid (10.04):

    http://packages.ubuntu.com/search?searchon=contents&keywords=libnss3.so&mode=exactfilename&suite=lucid&arch=any

    This recently just returns an error.

  • You mean, which package and not which application. The application is your package manager, e.g. Software Center.

    Using dpkg:

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

    Example

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

    Using apt-file:

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

    or also possible:

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

    Example

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

    Or online here, in the section Search the contents of packages.

    enter image description here

    Example

    enter image description here

    You mean, which package and not which application. The application is your package manager, e.g. Software Center. Okay. Thank you! :)

    Thank you for all the help! None of these suggestions helped me find which package installed this/these applications though. All searches just lead back to "Tracker". I suspected it was Enthoughts' Canopy though. That mile long EULA reminded me of my old Microsoft Windows daze, with which, I am so glad I am no longer involved. I saw that Tracker was installed yesterday so, as root, I got rid of it, along with Enthoughts' Canopy and, all problems are solved. I really thank you for all your help. It is such a great thing to have such support. Thanks again! Kevin

  • This is an extension to Alexx Roche's excellent answer. I tried to make an edit to that answer, but it got rejected (though not by Alexx)


    I was trying to track down what installed which on my system. After a little work I created /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 [email protected]) 2>/dev/null)"
    [ -z "$BINARY" ] && BINARY="[email protected]"
    echo Searching for $BINARY
    PACKAGE="$(apt-file search $BINARY|grep -E ":.*[^-.a-zA-Z0-9]${BINARY}$")"
    echo "${PACKAGE}"
    

    Though for most THINGs that are installed you can just use:

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

    For THINGs that are not installed, you can use:

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

    The apt-whatprovides script works for files that are and are not on your system. For example, my system lacked dig but had ping so this it what resulted:

    [email protected]:~ $ apt-whatprovides ping
    Searching for /bin/ping
    inetutils-ping: /bin/ping
    iputils-ping: /bin/ping
    
    [email protected]:~ $ 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
    

    Notice that Searching for is a complete path for ping (installed) and just the binary name for dig not installed. This helped me discover that I needed to install dnsutils without needing to go search https://packages.ubuntu.com/#search_contents

    This is such a good answer that I should delete mine!

  • I was trying to track down what installed which on my system. After a little work I created apt-whatprovides

    #!/bin/sh
    #apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
    #rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"
    
    BINARY=$(realpath $(which [email protected]))
    PACKAGE=$(apt-file search $BINARY|grep -E ":\s*${BINARY}$")
    echo ${PACKAGE%:*}
    

    Though for most THINGs you can just use

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

    Alexx, I love this answer. I hope you don't mind my edit. I made it also work for files that are not installed on the system. I made a backup at https://gist.github.com/RichardBronosky/41e91e858fdf070720704179aa08ed62 and will create my own answer if you revert/reject it.

    Update: It feels slimy to copy pasta this answer and make subtle changes to it, but my edit got rejected. I hope you feel like I maintained the integrity of your answer in mine.

    Feel free to edit or hack; anything that makes it better for you, (that's why I added MIT Licence! I don't even need credit.)

  • One reason you might have to do this is if you are compiling software which there already is an ubuntu package, you can run apt-get build-dep $PACKAGENAME. That will install all packages you need to compile $PACKAGENAME.

License under CC-BY-SA with attribution


Content dated before 6/26/2020 9:53 AM