I recently had to find out which APT package provided a specific command on one of my Ubuntu systems. After a bit of digging, I discovered that the dpkg
command’s magical -S
switch gives us a simple way to do this.
Per the dpkg-query man page, the -S
switch (also valid as --search
) does the following:
-S, --search filename-search-pattern... Search for packages that own files corresponding to the given pattern. Standard shell wildchars can be used in the pattern. This command will not list extra files created by maintainer scripts, nor will it list alternatives.
In other words, it takes a file pattern (optionally including a path or portions of a path), searches the known packages to see if any have owned files that match the requested search, and lists any packages that contain a match.
For example:
[chris@home ~]$ dpkg -S /usr/bin/GET libwww-perl: /usr/bin/GET [chris@home ~]$ which ls /bin/ls [chris@home ~]$ dpkg --search /bin/ls coreutils: /bin/ls [chris@home ~]$ dpkg --search /etc/cron.d sysstat, php5-common, cron, anacron, rsnapshot: /etc/cron.d [chris@home ~]$ dpkg --search /etc/cron.d/* anacron: /etc/cron.d/anacron php5-common: /etc/cron.d/php5 rsnapshot: /etc/cron.d/rsnapshot sysstat: /etc/cron.d/sysstat [chris@home ~]$ dpkg --search /etc/cron.daily google-chrome-beta, man-db, update-notifier-common, apt, popularity-contest, anacron, logrotate, aptitude, cracklib-runtime, dpkg, passwd, google-musicmanager-beta, sysstat, apache2, apache2.2-common, apport, google-talkplugin, cron, samba, bsdmainutils, ntp, mlocate: /etc/cron.daily [chris@home ~]$ which which /usr/bin/which [chris@home ~]$ dpkg -S /usr/bin/which debianutils: /usr/bin/which [chris@home ~]$ which dpkg /usr/bin/dpkg [chris@home ~]$ dpkg -S /usr/bin/dpkg dpkg: /usr/bin/dpkg [chris@home ~]$
I added in the which
command to show how you can retrieve the full path to specific commands.
Notice how supplying /etc/cron.d
returned a listing of all matches for that specific string while searching for /etc/cron.d/*
provides a separate match for each entry in the /etc/crond.d
directory.
I really need to dig deeper into the dpkg
command as it has a wealth of handy features that are just waiting to be used.