List all commands of a specific Debian package

I want to know the commands that a specific Debian package offers me.

For example lets say I installed a package called x.deb. This package surely contains some commands that i can use.

How to list these commands.

I know I can use compgen bash command to generate list of all available commands in my system but what i need is just for specific package.

I tried the solutions:

dpkg -L postgresql-9.3 | egrep '(bin|games)/'
/usr/lib/postgresql/9.3/bin/pg_upgrade
/usr/lib/postgresql/9.3/bin/pg_ctl
/usr/lib/postgresql/9.3/bin/pg_resetxlog
/usr/lib/postgresql/9.3/bin/postgres
/usr/lib/postgresql/9.3/bin/pg_xlogdump
/usr/lib/postgresql/9.3/bin/initdb
/usr/lib/postgresql/9.3/bin/pg_controldata
/usr/lib/postgresql/9.3/bin/postmaster

I tried the command postgres

<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b4c1c7d1c6f4c1c7d1c6e4d7">[email protected]</a>:~$ postgres
No command 'postgres' found, did you mean:
 Command 'postgrey' from package 'postgrey' (universe)
postgres: command not found

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Use dpkg -L pkgname and pipe it to a grep command searching for bin/ and games/:

$ dpkg -L bash | grep -E '(bin|games)/'
/bin/bash
/usr/bin/bashbug
/usr/bin/clear_console
/bin/rbash

If you want to check for all binaries regardless if they are in your $PATH try this bash function:

find_binaries (){
    dpkg -L "<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="012541">[email protected]</a>" | while read; do
        [ -f "$REPLY" -a -x "$REPLY" ] && echo "$REPLY"
    done
}

Invoke like so:

$ find_binaries postfix
...SNIP...
/usr/lib/postfix/postfix-files
/usr/lib/postfix/pipe
/usr/lib/postfix/proxymap
/usr/lib/postfix/local
/usr/lib/postfix/discard
...SNIP...

Method 2

1. Use a tool designed for the job.

The easiest and probably the most robust way is to install dlocate:

sudo apt-get install dlocate

You can then run

dlocate -lsbin package-name

As explained in man dlocate:

-lsbin List full path/filenames of executable files (if any) in package

2. Parse the package database

This is a similar approach to @Winny’s but simplified

apt-file -F list package | cut -d ' ' -f 2 | 
    while read file; do [[ -x $file && -f $file ]] && echo "$file"; done

If you don’t have apt-file installed, you can install and set it up with these commands:

sudo apt-get install apt-file
sudo apt-file update

The command above uses apt-file to list a package’s contents and then bash’s tests -f (is this a file?) and -x (is it executable?) and prints the file’s name if both tests are passed.

Note that while something like the command below will get you most executables:

apt-file -L list package | grep -Ew 'bin|sbin'

it will not find all because you also get executables in places like /opt or even /lib (various udev tools for example). So, while using the -w to match whole words increases your chances of identifying the files correctly, parsing the path is not a good approach and you should use one of the methods above instead.

Method 3

If you have dlocate installed, there’s an easy way to list all the commands in an installed package:

dlocate -lsbin PACKAGE-NAME

With just dpkg, you can list the files in the standard PATH directories (they’re almost all executable programs, with very few exceptions):

dpkg -L PACKAGE-NAME… | sed -n 's!^(/s?bin|/usr/s?bin|/usr/games)/!!p' | sort -u

The exceptions are a couple directories — as of Debian wheezy, just two: /usr/bin/mh and /usr/bin/nu-mh.

If the package isn’t installed, replace dpkg -L by apt-file -F list:

apt-file -F list PACKAGE-NAME… | sed -n 's!^(/s?bin|/usr/s?bin|/usr/games)/!!p' | sort -u

While there are executable files in other directories, they are not meant to be executed directly, which makes them irrelevant here.

These methods all miss a set of programs: those that are provided through the alternatives mechanism. For example, for the ftp package, only netkit-ftp and pftp are provided, but this package actually provides the ftp command, because /usr/bin/ftp is a symbolic link to /etc/alternatives/ftp which is a symbolic link to one of the ftp implementations on the system, potentially /usr/bin/netkit-ftp. The following command (which isn’t an example of good programming, just a big one-liner) lists the commands provided by a package via the alternatives mechanism, as currently configured.

perl -lwe 'foreach (`dpkg -L @ARGV`) {chomp; ++$p{$_}} foreach (</bin/* /sbin/* /usr/bin/* /usr/sbin/*>) {$e = readlink; next unless defined $e and $e =~ m!^/etc/alternatives/!; $t = readlink $e; print if $p{$t}}' PACKAGE_NAME…

If you want to list the commands that could be provided via an alternative which is currently configured to point to a different package, you need to parse the files in /var/lib/dpkg/alternatives.

Symbolic links and configuration files that implement the alternatives mechanisms are not registered in packages but registered automatically in postinst, which makes it difficult (and in fact technically impossible if a package’s installation script doesn’t follow conventions) to query the alternatives provided by an uninstalled package.

Method 4

  1. Normally, *bin/ are the most common places to have all programs placed. Even using a link. So there is very little chance that you need to concern commands outside *bin/.
  2. If you have not installed apache2, dpkg -L surely won’t give you result. Please try apt-file tool (you need to install it).
  3. The name apache2 is a metapackage, it does not contain any programs.

Method 5

use below one command and replace systemd with your targeted package name. this command will list all available commands with their one-liner intro respectively

dpkg -L systemd | grep 'sbin|bin' | awk -F "/" '{print $NF}' | xargs man | grep ' - ' 2> /dev/null


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x