Skip to main content
5 of 8
Add -F '%p' instead of cut to avoid truncating package names at 32 characters. (http://unix.stackexchange.com/a/86087/44804)

Just the code

aptitude search '~i !~M' -F '%p' | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/maverick/ubuntu-10.10-desktop-amd64.manifest \
  | cut -d" " -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

Explanation

One way to think about this problem is to break this into three parts:

  • How do I get a list of packages not installed as dependencies?
  • How do I get a list of the packages installed by default?
  • How can I get the difference between these two lists?

##How do I get a list of packages not installed as dependencies?

The following command seems to work on my system:

$ aptitude search '~i !~M' -F '%p' | sort -u > currentlyinstalled.txt

Similar approaches can be found in the links that Gilles posted as a comment to the question. Some sources claim that this will only work if you used aptitude to install the packages; however, I almost never use aptitude to install packages and found that this still worked. The | sort -u sorts the file and removes duplicates. This makes the final step much easier.

How do I get a list of the packages installed by default?

Note: This section starts out with a 'wrong path' that I think is illustrative. The second piece of code is the one that works.

This is a bit trickier. I initially thought that a good approximation would be all of the packages that are dependencies of the meta-packages ubuntu-minimal, ubuntu-standard, ubuntu-desktop, and the various linux kernel related packages. A few results on google searches seemed to use this approach. To get a list of these dependencies, I first tried the following (which didn't work):

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

This seems to leave out some packages that I know had to come by default. I still believe that this method should work if one constructs the right list of metapackages.

However, it seems that Ubuntu mirrors contain a "manifest" file that contains all of the packages in the default install. The manifest for my system is here:

http://mirror.pnl.gov/releases/maverick/ubuntu-10.10-desktop-amd64.manifest

If you search through this page(or the page of a mirror closer to you):

http://mirror.pnl.gov/releases/maverick/

You should be able to find the ".manifest" file that corresponds to the version and architecture you are using. To extract just the package names I did this:

wget -qO - http://mirror.pnl.gov/releases/maverick/ubuntu-10.10-desktop-amd64.manifest | cut -d" " -f1 | sort -u > defaultinstalled.txt

The list was likely already sorted and unique, but I wanted to be sure it was properly sorted to make the next step easier. I then put the output in defaultinstalled.txt.

How can I get the difference between these two lists?

This is the easiest part since most Unix-like systems have many tools to do this. The comm tool is one of many ways to do this:

comm -23 currentlyinstalled.txt defaultinstalled.txt

This should print the list of lines that are unique to the first file. Thus, it should print a list of installed packages not in the default install.

Steven D
  • 47.6k
  • 15
  • 123
  • 117