73

How do I list both programs that came with my distribution and those I manually installed?

Chris Down
  • 122,090
  • 24
  • 265
  • 262
InquilineKea
  • 6,152
  • 12
  • 43
  • 42

4 Answers4

94

That depends on your distribution.

  • Aptitude-based distributions (Ubuntu, Debian, etc): dpkg -l
  • RPM-based distributions (Fedora, RHEL, etc): rpm -qa
  • pkg*-based distributions (OpenBSD, FreeBSD, etc): pkg_info
  • Portage-based distributions (Gentoo, etc): equery list or eix -I
  • pacman-based distributions (Arch Linux, etc): pacman -Q
  • Cygwin: cygcheck --check-setup --dump-only *
  • Slackware: slapt-get --installed

All of these will list the packages rather than the programs however. If you truly want to list the programs, you probably want to list the executables in your $PATH, which can be done like so using bash's compgen:

compgen -c

Or, if you don't have compgen:

#!/bin/bash
IFS=: read -ra dirs_in_path <<< "$PATH"

for dir in "${dirs_in_path[@]}"; do
    for file in "$dir"/*; do
        [[ -x $file && -f $file ]] && printf '%s\n' "${file##*/}"
    done
done
Chris Down
  • 122,090
  • 24
  • 265
  • 262
13

Answering the second part of the question (nothing really to be added to Chris' answer for the first part):

There is generally no way of listing manually installed programs and their components. This is not recorded anywhere if you didn't use a package manager. All you can do is find the binaries in standard locations (like Chris suggested) and in a similar way, guess where some libraries or some manual pages etc. came from. That is why, whenever possible, you should always install programs using your package manager.

rozcietrzewiacz
  • 38,754
  • 9
  • 94
  • 102
7

Programs should be reachable via the PATH, so just list everything in the path:

ls ${PATH//:/ }

Expect a result of about 3k-4k programs.

To exclude a probable minority of false positives, you may refine the approach:

for d in ${PATH//:/ } ; do 
    for f in $d/* ; do  
        test -x $f && test -f $f && echo $f
    done
done

It didn't make a difference for me.

user unknown
  • 10,267
  • 3
  • 35
  • 58
  • 2
    Note that this will also potentially list various non-programs as well (subdirectories of directories in `$PATH`, etc). – Chris Down Mar 25 '12 at 03:03
  • 1
    I added a test, but it didn't make a difference for me (how useful is a directory in a directory in the path, which isn't itself in the path?). But for cases, where you rely on correctness, it might be useful. – user unknown Mar 25 '12 at 05:42
  • 1
    awesome! I wasn't able to know version of Linux ( long story - but nothing criminal ) but this code saved my day :) – obenjiro Jan 12 '15 at 18:15
7

All the other answers (so far) deal with packages and binaries. If you mean "desktop applications", the ones that appear in your start menu, you can try:

ls /usr/share/applications | awk -F '.desktop' ' { print $1}' -

More solutions in another question.

Rolf
  • 681
  • 2
  • 8
  • 16