How do I export a list of installed Debian packages on a system, and then install those same packages on a new system?

5 Answers 5


To backup:

sudo dpkg --get-selections > /tmp/dpkglist.txt

To Restore:

sudo dpkg --set-selections < /tmp/dpkglist.txt
sudo apt-get -y update
sudo apt-get dselect-upgrade

Also see this question for additional options and info: Ubuntu, how to setup a new machine like an existing one

I have the above running in a daily cronjob that checks the dpgklist into SVN as part of our server inventory. This will allow you to keep a reasonable accurate inventory of installed packages across your servers and its easy to do a quick side-by-side diff to see if a server is missing a particular package.

  • 3
    I get this error message for each input line: dpkg: warning: package not in status nor available database at line ...
    – danorton
    Commented Mar 21, 2019 at 14:58
  • this way doesnt work since few ubuntu versions
    – QkiZ
    Commented Dec 30, 2019 at 16:44

aptitude also satisfies this usecase, and it preserves information about "automatically installed" packages that other methods do not. Run the following on the reference machine:

aptitude search -F '%p' '~i!~M' > package_list 

Copy package_list to the other machine and run

xargs aptitude --schedule-only install < package_list; aptitude install; 
  • 1
    Just a minor note. According to the aptitude reference manual, the "package" field is "expandable" by default, so aptitude search -F '%p' '~i!~M' > package_list should also work fine.
    – chronos
    Commented Oct 17, 2013 at 23:34
  • Regarding package backup: see plug for deborphan @ bogdan.org.ua/2013/10/18/…
    – TomRoche
    Commented Nov 17, 2015 at 5:43
  • [insert your own linebreaks, since http://serverfault.com/editing-help#linebreaks lies] Regarding package restore: this will need to be done as root, no? If so,<br/> The xargs in your restore commandline= xargs aptitude --schedule-only install < package_list; aptitude install; makes me want to know,<br/> 1. Why does aptitude need the xargs? dpkg --set-selections doesn't.<br/> 2. Presuming aptitude does need the xargs, where to put one or more sudos in your restore commandline? Or otherwise get root for running that line, presuming that's necessary.
    – TomRoche
    Commented Nov 17, 2015 at 6:00
  • Presumably, aptitude does not accept a list of packages on stdin but only on the command-line. The xargs command will do that, even calling the command multiple times if there are more than some limit (500 by default?) of values. sudo would need to be specified before xargs which will then run aptitude as the same user. And again before aptitude after the semicolon (;). Commented Jun 9, 2022 at 18:20

That's a good idea, and you might also set up one server with apt-proxy if you make a habit of this.

  • After playing around with several proxies for apt, I ended up deciding on apt-cacher-ng. apt-cacher-ng is very simple to setup and from several accounts it seems to be more robust than the original apt-proxy. Each person has their own favourite though. unix-ag.uni-kl.de/~bloch/acng Commented Aug 20, 2009 at 21:06
  • My vote is for approx, it's the only one that isn't some kind of insane.
    – womble
    Commented Aug 20, 2009 at 23:08
  • Interesting... I've not actually tried any of the alternatives.
    – user17642
    Commented Aug 21, 2009 at 16:00

faultyservers answer worked for me only after running a different command as per http://rayslinux.blogspot.de/2012/10/ubuntu-1210-dpkg-warning-package-not-in.html

sudo apt-get install dselect sudo dselect access sudo dselect update

Before that running

sudo apt-get dselect-upgrade

only returned

dpkg: warning: package not in database at line 302: xfonts-utils
dpkg: warning: found unknown packages; this might mean the available database is outdated, and needs to be updated through a frontend method
pi@FHEM-new:/tmp $ sudo apt-get dselect-upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

I was trying to install the same packages from my old Raspberry Pi (running Raspbian GNU/Linux 7 (wheezy)) on my new Raspberry (Raspbian GNU/Linux 8 (jessie)).


In recent versions of Debian/Ubuntu/Mint, dpkg needs available packages to be in its "avail" database for dpkg --set-selections to work.

Example sequence:

  1. (On other system) dpkg --get-selections > installed.dselect
  2. sudo apt update
  3. apt-cache dumpavail | sudo dpkg --merge-avail
  4. sudo dpkg --set-selections < installed.dselect
  5. sudo apt-get dselect-upgrade

The third command populates dpkg's "avail" database. It's important to run this before setting the selections of which additional packages to install.

This reqires dpkg v1.17.7 and later. See Q: Why does ''dpkg --set-selections'' not record selections for unknown packages? on the Debian wiki for more details.

  • 1
    Does this preserve the "automatically installed" information, any idea?
    – drumfire
    Commented Jun 12 at 22:16

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .