I'd like to output a list of all installed packages into a text file so that I can review it and bulk-install on another system. How would I do this?

  • 4,130
  • 6
  • 30
  • 60
  • 54,329
  • 64
  • 150
  • 210

24 Answers24


Ubuntu 14.04 and above

The apt tool on Ubuntu 14.04 and above makes this very easy.

apt list --installed

Older Versions

To get a list of packages installed locally do this in your terminal:

dpkg --get-selections | grep -v deinstall

(The -v tag "inverts" grep to return non-matching lines)

To get a list of a specific package installed:

dpkg --get-selections | grep postgres

To save that list to a text file called packages on your desktop do this in your terminal:

dpkg --get-selections | grep -v deinstall > ~/Desktop/packages

Alternatively, simply use

dpkg -l

(you don't need to run any of these commands as the superuser, so no sudo or any other variants necessary here)

  • 37,548
  • 6
  • 35
  • 42
  • 41
    Then, when installing to the new computer, do `cat ~/Desktop/packages > sudo dpkg --set-selections && sudo apt-get dselect upgrade` [source](http://ubuntuforums.org/archive/index.php/t-169062.html) – koanhead Dec 17 '10 at 05:51
  • 15
    The syntax for dpkg may have changed slightly since 2006 because that command didn't work for me, @koanhead. `sudo dpkg --set-selections < ~/Desktop/packages && sudo apt-get -u dselect-upgrade` does the trick. – James Feb 17 '11 at 20:44
  • 256
    Note that this won't keep track of which packages were explicitly installed by the user and which were installed as dependencies. This means that if you use this method to recreate your setup on another machine, apt won't be able to remove unneeded dependencies when you remove a given package. – intuited Aug 28 '12 at 21:03
  • 2
    Note that if you've installed some packages from other sources (other ppa sites), you'll need to add those sources to sources.list when you setup the new machine. Some examples: dropbox, heroku, steam, braid, ... – drevicko Jun 14 '13 at 01:52
  • 79
    It's sad and amazing that @intuited 's comment is not better understood by the community. Would the more "highly rated" contributors stop to think more before giving the advice that simply reloading old packages on a new ubuntu version is not a good idea(?). With all the dpkg options I still do not see one that pulls out the 'expressely' installed packages by a user in order that THAT list can be reloaded and allowed to have its dependencies installed; I would love to know it - please share that info. In the meantime, make a list of the packages you really need on a re-install and run that – Ricalsin Jul 17 '13 at 17:42
  • 1
    @Ricalsin obviously `dpkg --get-selections` will get you a list of **all packages**, independent the status, installed, not installed, hold. The method to get a list of installed packages is with text parsing, or using `dpkg -l`. – Braiam Sep 27 '13 at 17:09
  • To make the output compatible with apt-get install, use the following: dpkg --get-selections | grep -v deinstall | tr "\t" " " | cut -f1 -d" " | sed -e 's/:amd64$//' – Larry R. Irwin Mar 26 '18 at 18:54
  • To get just the package names: `apt list --installed |egrep -o '^[^/]*'`. – ggll Oct 31 '18 at 15:23
  • Anyone else getting `apt: invalid flag: list`? Version `apt 1.7.0_79` with `Ubuntu 16.04` – Katie Mar 08 '19 at 23:24
  • `dpkg -l` You should have led with that. – frakman1 Jan 26 '20 at 17:29
  • I feel it's a substantial *shortcoming* of the package management system that it provides no way to distinguish packages added by the user vs. packages included as part of the standard distribution (or installed as dependencies). See `MacPorts` implementation of `port installed` vs `port installed requested` as one way to see this distinction. – Seamus Jul 09 '20 at 22:45
  • I would do `apt list --installed 2>/dev/null | awk -F '/' '!/automatic/&&NR>1{print $1}' > installed` then `sudo apt-get install \`cat installed\`` – JustinCB Jan 01 '21 at 01:48
  • @intuited There is `apt-mark minimize-manual` in Debian Stretch and Ubuntu Xenial. – iBug Mar 02 '22 at 07:13
  • Is there a way to generate a Dockerfile that will use this and output all those missing module based on a base OS (FROM ubuntu:18.04)? – kambi Jul 11 '22 at 12:59

To get just the packages which were expressly installed (not just installed as dependencies), you can run

aptitude search '~i!~M'

This will also include a brief description, which you may want. If not, also add the option -F '%p', as mentioned by karthick87.

Yet another option seems to be to copy the file /var/lib/apt/extended_states, which is a text file database in this format:

Package: grub-common
Architecture: amd64
Auto-Installed: 0

Package: linux-headers-2.6.35-22-generic
Architecture: amd64
Auto-Installed: 1

Auto-Installed: 0 indicates that the package was expressly installed and is not just a dependency.

  • 10,722
  • 7
  • 47
  • 61
  • 6,985
  • 4
  • 27
  • 38
  • 61
    This should be the correct answer. Why list dependencies? – Stavros Korokithakis Dec 08 '12 at 01:44
  • 14
    This **should** be the answer, but using *aptitude* is a bit unreliable because of Multiarch *currently* (fixes on the way), unfortunately. Still +1 for pointing out only listing explicitly installed packages and a way to do this (despite it won't work on 11.10+ currently). – gertvdijk Jan 11 '13 at 15:31
  • @gertvdijk: Interesting.. can you provide a link with a more detailed explanation? – intuited Jan 11 '13 at 15:59
  • @gertvdijk: any idea how reliable the second method is (using `/var/lib/apt/extended_states`)? – intuited Jan 11 '13 at 16:01
  • @gertvdijk: from what's written in [this bug report](https://bugs.launchpad.net/ubuntu/+source/aptitude/+bug/831768), it doesn't sound like there would be problems using `aptitude` to dump the system state. – intuited Jan 11 '13 at 16:17
  • @intuited You've found the right bug report :) Looks like you're right for the requirements of this Q, but I wouldn't rely on a tool without Multiarch-awareness in Ubuntu in general. However, if *you* as a user are aware of it and it works for you, no big deal. I'd suggest to add a note, that despite this bug it should work properly. – gertvdijk Jan 11 '13 at 18:35
  • 5
    @intuited "Fix Released" for Precise (some time ago). :) – gertvdijk Jun 20 '13 at 20:10
  • 14
    This lists all packages, not just manually installed packages on Ubuntu 13.10. – Eamon Nerbonne Oct 31 '13 at 14:33
  • 4
    on Ubuntu-15.10, must install aptitude first _eg_: `sudo apt-get install aptitude` – Mark Mikofski Apr 09 '16 at 16:00
  • 16
    is there a way to achieve the same result with `apt-get`? – Javier Arias Jul 10 '17 at 13:27
  • 3
    Any chance of updating this answer given that it only works on (now) obsolete versions of Ubuntu? Ideally with a fix but if not at least an edit to make clear the Ubuntu version that it works for. – Jon Bentley Apr 25 '20 at 16:10
  • This really is the best answer. – drewkiimon Mar 12 '21 at 21:47

To list all packages intentionally installed (not as dependencies) by apt commands, run the following :

(zcat $(ls -tr /var/log/apt/history.log*.gz); cat /var/log/apt/history.log) 2>/dev/null |
  egrep '^(Start-Date:|Commandline:)' |
  grep -v aptdaemon |
  egrep '^Commandline:'

This provides a reverse time based view, with older commands listed first:

Commandline: apt-get install k3b
Commandline: apt-get install jhead

Installation data also showing synaptic usage, but without details (the same with installation date) :

(zcat $(ls -tr /var/log/apt/history.log*.gz); cat /var/log/apt/history.log) 2>/dev/null |
  egrep '^(Start-Date:|Commandline:)' |
  grep -v aptdaemon |
  egrep -B1 '^Commandline:'

providing the following:

Start-Date: 2012-09-23  14:02:14
Commandline: apt-get install gparted
Start-Date: 2012-09-23  15:02:51
Commandline: apt-get install sysstat
  • 185,114
  • 48
  • 449
  • 695
  • 2,535
  • 1
  • 11
  • 2
  • 3
    Or (with zgrep and removing update messages): `zgrep -hE '^(Start-Date:|Commandline:)' $(ls -tr /var/log/apt/history.log*.gz ) | egrep -v 'aptdaemon|upgrade' | egrep -B1 '^Commandline:'` – belacqua May 17 '13 at 16:16
  • 3
    Does this approach miss packages installed with `dpkg`?? – drevicko Jun 13 '13 at 23:27
  • 8
    While the above simple answers are good for the general user. This method by far is the best for backtracking all the customizations done to the machine, as it also shows what was removed, or added, from the base image, as it list them in the sequence it was performed, and helps you remember which is the correct sequence to add them back in another system. – AllGamer Jul 24 '14 at 16:27
  • @AllGamer My only problem is that `/var/log/` is a memory mapped directory on my machine, so I cannot use this approach... – Ali Aug 16 '14 at 20:44
  • the drawback using this method is if someone delete the history.log, you won't get any result – whale_steward Mar 10 '15 at 08:04
  • 3
    @drevicko you are correct, it does not list packages that are installed with dpkg – Steve Buzonas Apr 14 '15 at 10:39
  • or to see only installed/removed/whatever try to play with the last word in expression , e.g. getting only the installed - "( zcat $( ls -tr /var/log/apt/history.log*.gz ) ; cat /var/log/apt/history.log ) | egrep '^(Start-Date:|Commandline:)' | grep -v aptdaemon | egrep '^Commandline:' | egrep 'install'" – Tebe Aug 15 '15 at 13:03
  • 3
    This is pretty handy for keeping organized-- my brain prefers it this way for whatever reason.. – JeremyFelix Apr 08 '16 at 15:36
  • Great answer! Now I have to figure out how to set the system to never delete old log files from /var/log/apt/history.log.* on my next ubuntu installation – Roland Dec 27 '18 at 22:17

Create a backup of what packages are currently installed:

dpkg --get-selections > list.txt

Then (on another system) restore installations from that list:

dpkg --clear-selections
sudo dpkg --set-selections < list.txt

To get rid of stale packages:

sudo apt-get autoremove

To get installed like at backup time (i.e. to install packages set by dpkg --set-selections):

sudo apt-get dselect-upgrade
  • 13,606
  • 4
  • 45
  • 93
  • 2,205
  • 1
  • 12
  • 3
  • 8
    Great tip about restoring on another machine. +1. – Drew Noakes Jan 17 '13 at 00:28
  • 16
    migrating between 2 different ubuntu 12.04 machines this approach broke my system. it took a while until I realized that somehow `ubuntu-desktop` got uninstalled - probably due to one of the dpkg commands. be careful, it took me hours to repair the damage! – Karl Frisk Aug 19 '13 at 16:02
  • 1
    And sometimes system updates an app that you specifically wish system to not touch it ever, do fire this at end of commands `sudo apt-mark hold name-your-package ` . This will prevent apt-get from upgrading to current version which is the default for updating process. – Faron Mar 01 '16 at 00:29
apt-mark showmanual

man pages state:

will print a list of manually installed packages

So, it should just give a list of explicitly installed packages (though this includes packages that were part of the default initial install) without all of the dependencies included due to these packages being installed.

To output the result into a text file:

apt-mark showmanual > list-manually-installed.txt
Pablo Bianchi
  • 11,750
  • 4
  • 62
  • 103
Tim Tisdall
  • 1,371
  • 11
  • 12
  • On Debian "apt-mark showmanual" didn't work on "squeeze" but worked on "wheezy" – Wadih M. Oct 05 '15 at 00:07
  • 14
    Like with most other answers, `apt-mark showmanual` doesn't really. It also lists tons of automatically installed packages, probably part of the base install. – mivk Nov 29 '15 at 22:05
  • 8
    Well the question was for installed packages and this gives all installed packages minus the automatically installed dependencies. It does include the initial packages as part of the initial install. I guess you could run this on a fresh install to get a list of the default installs and then subtract that from this to see the difference. – Tim Tisdall Nov 29 '15 at 23:54
  • 11
    No one mention this alternative to list manually installed packages: `apt list --manual-installed`. – Pablo Bianchi Jan 18 '19 at 01:59

dpkg-query (instead of dpkg --get-selections, which lists some packages that are not installed) as follows:

dpkg-query -W -f='${PackageSpec} ${Status}\n' | grep installed |  sort -u | cut -f1 -d \ > installed-pkgs


dpkg -l | grep ^ii | sed 's_  _\t_g' | cut -f 2 > installed-pkgs
d a i s y
  • 5,273
  • 9
  • 38
  • 57
  • 1,235
  • 9
  • 7
  • Typying ``# for pkg in `cat installed-pkgs`; do apt-get install -y $pkg; done`` in the second system I have made this so that it will install Packages. – user9869932 Mar 11 '15 at 19:46
  • 1
    @julianromera: `apt-get install -y $(< installed-pkgs)` will make it so that apt-get runs just once and takes care of all dependencies at once. – jamadagni Nov 10 '15 at 08:29
  • @julianromera...correct me if I'm mistaken but to build an app with dependencies before doing the install usually would be `sudo apt-get build-dep name-package; sudo apt-get install name-package; ` ? – Faron Mar 01 '16 at 00:39

To list all installed packages,

dpkg -l |awk '/^[hi]i/{print $2}' > 1.txt


aptitude search -F '%p' '~i' > 1.txt


dpkg --get-selections > 1.txt

You will get the result 1.txt file in your home folder or you can specify your own path.

d a i s y
  • 5,273
  • 9
  • 38
  • 57
  • 77,675
  • 59
  • 190
  • 232


This package can be used to clone/restore the packages on a apt based system.

  • It will save/restore the packages, sources.list, keyring and automatic-installed states.
  • It can also save/restore no longer downloadable packages using dpkg-repack.

source: man apt-clone

APT-Clone is used by ubiquity (Ubuntu installer) for upgrade process. It is much better than the dpkg --get-selections solution because:

  1. It preserves all repositories information.
  2. It keeps track of what packages were automatically installed.
  3. It allows to repack locally installed DEB files.

How to Use

  1. Install

     sudo apt-get install apt-clone
  2. Make backup

     sudo apt-clone clone path-to/apt-clone-state-ubuntu-$(lsb_release -sr)-$(date +%F).tar.gz
  3. Restore backup

     sudo apt-clone restore path-to/apt-clone-state-ubuntu.tar.gz

    Restore to newer release:

     sudo apt-clone restore-new-distro path-to/apt-clone-state-ubuntu.tar.gz $(lsb_release -sc)

Result structure

It makes a simple gzipped tar file which can be easily edited and reviewed before restoring on the other machines. Here an example of its structure:

├── etc
│   └── apt
│       ├── preferences.d
│       ├── sources.list
│       ├── sources.list.d
│       │   ├── anton_-ubuntu-dnscrypt-vivid.list
│       │   ├── maarten-baert-ubuntu-simplescreenrecorder-vivid.list
│       │   └── megasync.list
│       ├── trusted.gpg
│       └── trusted.gpg.d
│           ├── anton__ubuntu_dnscrypt.gpg
│           ├── anton__ubuntu_dnscrypt.gpg~
│           ├── maarten-baert_ubuntu_simplescreenrecorder.gpg
│           └── maarten-baert_ubuntu_simplescreenrecorder.gpg~
└── var
    └── lib
        └── apt-clone
            ├── extended_states
            ├── installed.pkgs
            └── uname
  • 45,763
  • 13
  • 139
  • 250

You can use Synaptic to save the current state of your installed packaged. In Synaptic, select "file/save markings", Enter the name of the file to save the state to, and make sure to check the "Save full state, not only changes" box.

The file saved from this can be loaded into a new machine using "file/read markings" in Synaptic.

  • 4,528
  • 3
  • 27
  • 29

I recommend using blueprint. Even though it is designed for servers, it can be also used from desktops as well. It will create a shell script/chef/puppet that you ca use to re-install all you packages.

  • 572
  • 4
  • 7
  • 1
    I am not trying a complete mirror, but only the fact of taking config files into account is awesome. I was looking for such a tool for a while now, thank you very much! – tbolender Sep 05 '14 at 09:58

There's also a tool called Aptik (currently proprietary, both command line and GUI) which can help you view a list of all installed packages, with an option to select/unselect some of them, make a backup list, and then restore the same set of packages in another system.

To install:

sudo add-apt-repository -y ppa:teejee2008/ppa
sudo apt-get update
sudo apt-get install aptik

Further info: https://teejeetech.in/aptik/

enter image description here

As can be seen in the screenshot, Aptik lets you also backup and restore PPAs, which will certainly be necessary to install some of the packages installed.

Pablo Bianchi
  • 11,750
  • 4
  • 62
  • 103
  • 10,722
  • 7
  • 47
  • 61

You want to reinstall the packages now there on 12.04, right?

If so, it's very easy. You'll need an "Ubuntu Single Sign On account." (Create it before reinstalling so that your system is synced.)

  1. Go to the Software Center and look for the "Sync Between Computers..." option under the File menu.

  2. When you click on it you will see your computer registered and a list of all apps on your computer.

  3. When you will install fresh, that computer will be considered a new computer.

  4. You just have to sign in to your Ubuntu account and your previous computer will be shown.

  5. Click on it; you'll get a list of all apps. Select "install" on the app you want to install.

  • 213
  • 1
  • 6
  • 7,548
  • 15
  • 56
  • 88
  • I set the same name for my computer on a fresh installation to prevent from huge downloading from Ubuntu One server each time. Do you think that this work for me? – AliN Aug 17 '13 at 20:29

You can look at the apt log under /var/log/apt/ and the dpkg log under /var/log/

and you can get the list of the installed packages with just a command:

dpkg -l | grep '^ii '
  • 4,632
  • 1
  • 42
  • 49
  • 79,899
  • 54
  • 233
  • 266

There's a great explanation on Unix StackExchange that describes how to use aptitude to list packages not installed as dependencies, and how to compare that list with the list of default packages for your Ubuntu release.

To obtain the manifest file for desktop versions of 12.04 and newer, visit this site, choose your release, and scroll down below the CD images to the files section. You'll find something like "ubuntu-12.04.4-desktop-amd64+mac.manifest" that matches your architecture.

For server versions you'll need to obtain the manifest file from the ISO that was used to install the original system. For a VPS or cloud server, your provider may make the images available or you might need to contact them.

Here's an example using the code from the referenced post, along with modifications to install on the new server.

Old server (code from other post, output saved to file):

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currently-installed.list
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
  | cut -f1 | sort -u > default-installed.list
comm -23 currently-installed.list default-installed.list > user-installed.list

On the new server, copy the file using scp, then use sed to append 'install' to every line (-i performs an inline-replace). Then you can use the list as input to 'dpkg --set-selections' and install the packages with apt-get:

scp user@oldserver:user-installed.list .
sed -i 's/$/\tinstall/' user-installed.list
sudo dpkg --set-selections < user-installed.list
sudo apt-get dselect-upgrade

Before starting this task, I recommend reading and understanding all parts of the post mentioned in the beginning, and then consult the aptitude reference guide for details on search patterns and the Customizing how packages are displayed to use the -F option as you like.

  • 1,615
  • 1
  • 20
  • 29
  • 683
  • 5
  • 9

I'm surprised the apt-cache command designed exactly for this purpose hasn't been mentioned above...

apt-cache pkgnames

For more info, run apt-cache --help:

**apt-cache is a low-level tool used to query information
from APT's binary cache files

   gencaches - Build both the package and source cache
   showpkg - Show some general information for a single package
   showsrc - Show source records
   stats - Show some basic statistics
   dump - Show the entire file in a terse form
   dumpavail - Print an available file to stdout
   unmet - Show unmet dependencies
   search - Search the package list for a regex pattern
   show - Show a readable record for the package
   depends - Show raw dependency information for a package
   rdepends - Show reverse dependency information for a package
   pkgnames - List the names of all packages in the system
   dotty - Generate package graphs for GraphViz
   xvcg - Generate package graphs for xvcg
   policy - Show policy settings

  -h   This help text.
  -p=? The package cache.
  -s=? The source cache.
  -q   Disable progress indicator.
  -i   Show only important deps for the unmet command.
  -c=? Read this configuration file
  -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp
See the apt-cache(8) and apt.conf(5) manual pages for more information.
  • 774
  • 7
  • 11
  • 6
    TLDR; I eventually found that `apt --installed list`gives best result (as suggested in top answer above. Although `apt-cache pkgnames` seems to do the trick at first glance, it lists "all packages in the system" (per the help text above), which also includes packages which apt knows about but aren't actually installed. There's a `--installed` option but it doesn't seem to work with `pkgnames`. – sxc731 Jan 01 '16 at 16:05
  • 4
    `apt-cache pkgnames | wc -l` gives `55909` packages (the system knows about), whereas `aptitude search '~i!~M' | wc -l` gives `2160` (packages explicitly installed, without dependencies). – knb Apr 11 '17 at 08:42

For the complete rundown see:


half way across the page:

dpkg --list

  • 575
  • 4
  • 3

Help out this community wiki - Add up-to-date solutions.

dpkg, xargs, & apt-get

This command should accomplish the creation of a text file containing installed packages:

dpkg -l | awk  '{print $2}' > package_list.txt

To accomplish the bulk installation of the listed packages you'll need to edit 'package_list.txt'. Remove the weird lines at the top of the file using a text editor. You can then use this command to install packages from the created file using:

xargs < package_list.txt apt-get install -y

apt-cache, xargs, & apt-get

Only use this method if you want all current packages to be installed using the list (which includes automatically installed, etc).

Output the response of 'apt-cache pkgnames' to a file we'll simply name "package_list.txt". You can accomplish this with:

apt-cache pkgnames > package_list.txt

Then when you want to install packages from "package_list.txt" you would use this command:

xargs < package_list.txt apt-get install -y

apt-mark, xargs, & apt-get

We can use the command apt-mark showmanual to give a list of packages that were manually or initially installed with Ubuntu. We'll want to output that to a file we'll just call "package-list.txt". Use this command to accomplish that:

apt-mark showmanual > package-list.txt

The command we would use to install packages from the file "package_list.txt" is below.

xargs < package_list.txt apt-get install -y

Aptik Migration Utility

Utility to simplify re-installation of software packages after upgrading/re-installing Ubuntu-based distributions.
[Launchpad | Aptik]

For information on Aptik, try visiting its official page, and for a screenshot click here or view the end of this section.

Installing Aptik is simple. Follow these steps:

  1. Add the PPA with:
    sudo add-apt-repository -y ppa:teejee2008/ppa

  2. Update apt with the below command.
    sudo apt-get update

  3. Install Aptik using:
    sudo apt-get install aptik

Aptik Migration Utility v16.5.2

  • 348
  • 2
  • 4
  • 16
  • 1
    The output from `apt-mark showmanual` includes Bash, Unity, and Xorg, among others. Are they supposed to be there? – wjandrea Aug 16 '16 at 22:55
  • @wjandrea the output of 'apt-mark showmanual' includes Bash & Unity in my generated list, also. It should be normal as the command lists manually installed & initially installed w/ Ubuntu. – David your friend Aug 16 '16 at 22:59
  • First solution is the best. All other with `dpkg` and selections doesn't work on new Ubuntu since few versions. – QkiZ Nov 22 '19 at 01:03

The below command will also lists all the installed packages,

grep ' installed ' /var/log/dpkg.log /var/log/dpkg.log.1 | awk '{print $5}' | sort -u
Avinash Raj
  • 74,476
  • 52
  • 209
  • 250
  • The .1 there implies the log was rotated, if that's the case then maybe it's better to grep `/var/log/dpkg.log*` to get all rotated logs. – Steve Buzonas Apr 14 '15 at 11:55

To save a list of installed packages to a file named installed_packages.txt, just run:

dpkg-query --list >> installed_packages.txt
  • 1,367
  • 1
  • 16
  • 29


1. List the installed software packages on Ubuntu

To list the installed software packages on your machine you can use the following command:

sudo apt list --installed

The output of the command will be very similar to the following one, depending on which packages are currently installed:

acl/xenial,now 2.2.52-3 amd64 [installed]
adduser/xenial,xenial,now 3.113+nmu3ubuntu4 all [installed]
apache2/xenial-updates,xenial-security,now 2.4.18-2ubuntu3.1 amd64 [installed]
apache2-bin/xenial-updates,xenial-security,now 2.4.18-2ubuntu3.1 amd64 [installed,automatic]
apache2-data/xenial-updates,xenial-updates,xenial-security,xenial-security,now 2.4.18-2ubuntu3.1 all [installed,automatic]
apache2-doc/xenial-updates,xenial-updates,xenial-security,xenial-security,now 2.4.18-2ubuntu3.1 all [installed]
apache2-utils/xenial-updates,xenial-security,now 2.4.18-2ubuntu3.1 amd64 [installed]
apparmor/xenial-updates,now 2.10.95-0ubuntu2.5 amd64 [installed,automatic]
apt/xenial-updates,now 1.2.19 amd64 [installed]
apt-utils/xenial-updates,now 1.2.19 amd64 [installed]

2. Use the LESS program

To easily read the entire output you can use the less program.

sudo apt list --installed | less

3. Use the GREP Command

You can look for a specific package through the output using the grep program.

sudo apt list --installed | grep -i apache

4. List all packages that include Apache

The output from the above command will list all packages that include apache in their names.

apache2/xenial-updates,xenial-security,now 2.4.18-2ubuntu3.1 amd64 [installed]
apache2-bin/xenial-updates,xenial-security,now 2.4.18-2ubuntu3.1 amd64 [installed,automatic]
apache2-data/xenial-updates,xenial-updates,xenial-security,xenial-security,now 2.4.18-2ubuntu3.1 all [installed,automatic]
apache2-doc/xenial-updates,xenial-updates,xenial-security,xenial-security,now 2.4.18-2ubuntu3.1 all [installed]
apache2-utils/xenial-updates,xenial-security,now 2.4.18-2ubuntu3.1 amd64 [installed]
libapache2-mod-php/xenial,xenial,now 1:7.0+35ubuntu6 all [installed,automatic]
libapache2-mod-php7.0/xenial-updates,now 7.0.13-0ubuntu0.16.04.1 amd64 [installed,automatic]
libapache2-mod-security2/xenial,now 2.9.0-1 amd64 [installed]
libapache2-modsecurity/xenial,xenial,now 2.9.0-1 all [installed]

Apt supports patterns to match package names and options to list installed (--installed) packages, upgradeable (--upgradeable) packages or all available (--all-versions) package versions.

5. Use the DPKG program

Another alternative that you can use to list the installed software packages on your Ubuntu VPS is the dpkg command.

sudo dpkg -l

The output of the command will provide you with information such as the name of the package, version, architecture and short description about the package. Of course, you can use the grep program again to search for a specific package.

sudo dpkg -l | grep -i apache

The output should look like the one below:

ii  apache2                       2.4.18-2ubuntu3.1                     amd64        Apache HTTP Server
ii  apache2-bin                   2.4.18-2ubuntu3.1                     amd64        Apache HTTP Server (modules and other binary files)
ii  apache2-data                  2.4.18-2ubuntu3.1                     all          Apache HTTP Server (common files)
ii  apache2-doc                   2.4.18-2ubuntu3.1                     all          Apache HTTP Server (on-site documentation)
ii  apache2-utils                 2.4.18-2ubuntu3.1                     amd64        Apache HTTP Server (utility programs for web servers)
rc  apache2.2-common              2.2.22-6ubuntu5.1                     amd64        Apache HTTP Server common files
ii  libapache2-mod-php            1:7.0+35ubuntu6                       all          server-side, HTML-embedded scripting language (Apache 2 module) (default)
rc  libapache2-mod-php5           5.5.9+dfsg-1ubuntu4.16                amd64        server-side, HTML-embedded scripting language (Apache 2 module)
ii  libapache2-mod-php7.0         7.0.13-0ubuntu0.16.04.1               amd64        server-side, HTML-embedded scripting language (Apache 2 module)
ii  libapache2-mod-security2      2.9.0-1                               amd64        Tighten web applications security for Apache
ii  libapache2-modsecurity        2.9.0-1                               all          Dummy transitional package
ii  libapr1:amd64                 1.5.2-3                               amd64        Apache Portable Runtime Library
ii  libaprutil1:amd64             1.5.4-1build1                         amd64        Apache Portable Runtime Utility Library
ii  libaprutil1-dbd-sqlite3:amd64 1.5.4-1build1                         amd64        Apache Portable Runtime Utility Library - SQLite3 Driver
ii  libaprutil1-ldap:amd64        1.5.4-1build1                         amd64        Apache Portable Runtime Utility Library - LDAP Driver

With the competition of this tutorial, you have successfully learned how to list installed packages in Ubuntu.

  • 94,385
  • 15
  • 187
  • 286
M.A.K. Ripon
  • 2,869
  • 2
  • 24
  • 36

In addition to APT packages, many GUI packages are nowadays distributed as snaps.

If your package can't be found in apt list --installed, then try snap list:

$ snap list

Name                  Version                     Rev   Tracking  Publisher       Notes
gimp                  2.10.10                     165   stable    snapcrafters    -
gnome-calculator      3.32.1                      406   stable/…  canonical✓      -
keepassxc             2.4.1                       267   stable    keepassxreboot  -

It's also a good idea to add /snap/bin to the PATH so you can start those from the terminal (done automatically for non-root users).

  • 676
  • 7
  • 14

I think it is interesting to note apt list --installed or dpkg-query --list actually use the file called /var/lib/dpkg/status in behind where all the info about the packages is beard.

So if you would like to deal with the super extended list of packages just cat /var/lib/dpkg/status.

Note: Do not alter /var/lib/dpkg/status file.

  • 909
  • 8
  • 14

The package dctrl-tools provide the grep-status tool to get the list of the packages marked as installed on your system:

sudo apt install dctrl-tools


grep-status -FStatus -sPackage -n   "install ok installed"

See: man dctrl-tools

Pablo Bianchi
  • 11,750
  • 4
  • 62
  • 103
  • 2,701
  • 1
  • 16
  • 29

Another, easy and graphically beautiful approach is to use apt show command with '~i' -a flag to list only installed packages:

apt show '~i' -a

No need to use sudo.

By default, it also give useful information about all the packages, for example:

Package: linux-headers-generic-hwe-20.04
Status: install ok installed
Priority: optional
Section: kernel
Source: linux-meta-hwe-5.13
Maintainer: Ubuntu Kernel Team 
Installed-Size: 19.5 kB
Depends: linux-headers-5.13.0-30-generic
Download-Size: unknown
APT-Manual-Installed: no
APT-Sources: /var/lib/dpkg/status
Description: Generic Linux kernel headers
 This package will always depend on the latest generic kernel headers

If you want to exclude this information, use grep to print only the package name:

apt show '~i' | grep 'Package:'

For example:

Package: linux-firmware
Package: linux-generic-hwe-20.04
Package: linux-image-generic-hwe-20.04
Package: linux-headers-generic-hwe-20.04
Package: linux-headers-5.13.0-28-generic
Package: linux-hwe-5.13-headers-5.13.0-28
Package: linux-headers-5.13.0-30-generic
Package: linux-hwe-5.13-headers-5.13.0-30
Package: linux-modules-5.13.0-28-generic
Package: linux-modules-extra-5.13.0-28-generic
Package: linux-modules-5.13.0-30-generic
Package: linux-modules-extra-5.13.0-30-generic
  • 5,529
  • 1
  • 19
  • 42