27

I want to get a list of packages that I have installed using apt-get.

i.e. any packages that I have installed since my Linode (Debian) was initially created.

Is this possible?

marked as duplicate by Stephen Kitt, Rui F Ribeiro, muru, Kusalananda, mdpc Jan 29 '18 at 18:32

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • 2
    both answers here mention the history.log files in /var/log/apt/. It's important to note that, by default, logrotate is configured to keep only the last 12 months worth of these files. The same is true of the /dpkg.log files in /var/log (which provide similar infomation in an (IMO) more-easily parsed format). Edit /etc/logrotate.d/{apt,dpkg} to change retention policy for your system. – cas Jun 7 '16 at 4:09
26

You can list installed package using apt using the following command:

apt --installed list

Edit

Use the following command to list installed package through apt-get :

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt-get install (?!.*--reinstall)\K.*'

Source: Askubuntu

  • 4
    As you have stated that lists all packages installed. I want packages that I have manually installed using apt-get commands. – user598200 Jun 6 '16 at 18:49
  • 1
    @user598200 - Consider accepting this answer. :) – Muhamed Huseinbašić Apr 12 '17 at 8:18
  • 1
    Based on this askubuntu answer I get to (zcat $(ls -tr /var/log/apt/history.log*.gz); cat /var/log/apt/history.log) 2>/dev/null | egrep '^(Commandline: apt(-get)? install)' | grep -v aptdaemon | egrep '^Commandline:' – Pablo Bianchi Jun 29 '17 at 23:12
  • 1
    zgrep -hPo '^Commandline: apt-get install (?!.*--reinstall)\K.*' /var/log/apt/history.log{.*.gz,} produces the same output without the unnecessary zcat and cat. if you don't care about the exact order of package names in the output, /var/log/apt/history.log* will do for the filename argument. – cas Nov 16 '17 at 1:05
6
zgrep -h ' install ' /var/log/dpkg.log* | sort | awk '{print $4}'

This will give you a list of packages that have been installed, in the order that they were installed.

As per my comment, only the last 12 months worth of/var/log/dpkg.log* files are kept by default. To change this, edit /etc/logrotate.d/dpkg. For example, change rotate 12 to rotate 1200 to keep the last 1200 months (100 years) worth - effectively forever, never delete the old logs.

BTW, if you want to see when packages were upgraded, change install to upgrade. e.g.

zgrep -h ' upgrade ' /var/log/dpkg.log* | sort

same for remove and purge.

1

Use dpkg to list all packages installed on a system: dpkg --get-selections

To list all packages installed using apt-get look at /var/log/apt/history.log. This log also contains packages you have removed. You can grep for the lines that start with Install:.

  • As you have stated that lists all packages installed. I want packages that I have manually installed using apt-get commands. – user598200 Jun 6 '16 at 18:45
  • @user598200 Ah. Thank you for clarifying. See my edited answer. I am not sure if apt-get has that functionality. But whenever you install something, it is appended to the log file I mention in the answer. – Peschke Jun 6 '16 at 18:49
  • Thanks. Any way I can go through all of the /var/log/apt/history.log* files and print out the package names in one hit? – user598200 Jun 6 '16 at 18:51
  • @user598200 You could use grep. grep "Install: package" /var/log/apt/history.log* – Peschke Jun 6 '16 at 19:00
1

Ubuntu 14.04 and above use apt list --installed for older versions use dpkg --get-selections | grep -v deinstall

1

A bit shorter and sorted

gunzip -c /var/log/apt/history.log.*.gz | grep 'apt-get install' | cut -f4- -d" " | tr ' ' $'\n' | sort -u
  • 1
    Some explanation as to why this is better than the answer @GAD3R gave would be helpful. – Anthon Jul 12 '17 at 20:26
  • First of all, it's shorter, second of all the output is sorted – jedi Jul 12 '17 at 21:00
  • The idea on U&L is that you improve your answer (or question in case you had posted one) by editing the post, instead of hiding valuable information in comments. As I would cut and paste the command the 26 bytes less is not so interesting, but the fact that your output is sorted really belongs in the answer itself. If such an improvement was as a reaction to a request for clarification a simple "updated my answer" as comment will do, the commenter (in this case me) will get notified of that comment. I think the terseness also is the cause that someone downvoted your answer. – Anthon Jul 12 '17 at 21:25
  • If you want to play golf then try zgrep -Pho '(?<=apt-get install ).*' /var/log/apt/history.log.*.gz | tr ' ' $'\n' | sort -u. – roaima Jul 12 '17 at 23:09
1

This relies on aptitude, but the following will give you a list of packages that are manually installed, i.e. aren't installed just because of dependency:

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

Depending on how the image is setup, it will probably also include some installed by the base system. You can get rid of a fair bit of those by switching them to being automatically installed, then just mark as manual the few you want to keep despite not having anything depending on them. This is easy to do with M inside aptitude on a bare system.

1

If you want to display only a list with the packages you have manually installed you could run:

apt --installed list | grep -v automatic

to not list packages flagged as automatically installed

-v, --invert-match   Invert the sense of matching, to select non-matching lines.
  • Short and sweet, and sorted alphabetically. – hlongmore Dec 14 '18 at 2:40

Not the answer you're looking for? Browse other questions tagged or ask your own question.