Tell me more ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I'd like to get a list of packages installed manually by apt or aptitude and be able to find out whether a foobar package was installed manually or automatically. Is there any neat way of doing that from the command line?

share|improve this question
Possible duplicate? - askubuntu.com/questions/365 – jrg Apr 28 '12 at 19:03

7 Answers

up vote 9 down vote accepted

apt-mark showauto | grep -iE '^foobar$' will output "foobar" if the package was installed automatically, nothing otherwise.

aptitude search '!~M ~i' will list the packages that were not installed automatically. It's a pity aptitude won't be part of the default install on Ubuntu Desktop starting from 10.10.

share|improve this answer
aptitude search shows ALL packages not just the ones that are manually installed (I assume that's what the OP wanted) – Oli Aug 16 '10 at 17:42
@Oli: look into aptitude search patterns; the pattern I'm using there should do exactly what the OP wants. – Li Lo Aug 16 '10 at 17:44
I ran it. It shows a whole load of packages that aren't installed. – Oli Aug 16 '10 at 17:46
My bad. Corrected. Thank you. – Li Lo Aug 16 '10 at 17:50
2  
Something isn't right with this, I'm using aptitude search '!~M ~i' and it lists 1043 packages. There is no way I installed that many packages manually. – ThatGraemeGuy Sep 16 '10 at 7:42
show 4 more comments

The following script will print out all the packages that are not set to automatic install and hence were installed manually:

#!/usr/bin/python

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.Config.FindDir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.ParseTagFile(open(STATE_FILE))
while tagfile.Step():
    pkgname = tagfile.Section.get("Package")
    autoInst = tagfile.Section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

it is based on how apt-mark prints out the automatically installed packages.

share|improve this answer
Kudos to you fine sir. This actually works, in contrast to the accepted answer. – Irfy Nov 1 '12 at 2:53

In newer versions of the package apt, there is also the apt-mark command

apt-mark showmanual
share|improve this answer

As Li Lo said, apt-mark showauto should get you a fat list of things automatically installed.

Now to show the things that are installed manually, it turns out there's a lovely simple search modifier for aptitude. But you don't want to to do that. You want to write a huge bash command that does some rocket science.

Note: This is more an illustration of how cool you'll look busting out massive bash commands to all your friends.

comm -3  <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)

I broke it onto two lines for readability. What does this do?

  • First we query dpkg for a list of packages that are installed.
  • We filter those for the ones that are actually installed (not just residual config)
  • We chop off the status
  • We compare that list with the automated list from apt-mark
  • We rock out because we can.
share|improve this answer
I doubt this is accurate, since dpkg often shows packages that are not installed – txwikinger Aug 16 '10 at 17:47
I know what you mean but my bash-fu isn't strong enough. I know you could show the status from dpkg-query, grep that down and then slice off the status. I'll have a go. – Oli Aug 16 '10 at 17:49
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort) is properly better ;) – Source Lab Aug 16 '10 at 17:54

If no one gives you a nice answer using a apr-something command you can do it the hard way. Apt-get stores its info in /var/lib/apt/extended_states. Any file that is installed automatically will be added to this file. If you install a package already in this file manually, the package will remain in this file but with Auto-installed: 0 in the second line. It's not deleted.

Note: As expected better answers that are likely to work if file placement changes have appeared. I keep mine just in case the info on the file location is useful.

share|improve this answer
1  
No. I took a quick look at that file to find that liferea was marked as auto-installed. I did an apt-get install liferea and it didn't install but I got output that was something to the effect of "marked as manually installed". Now liferea is still in the file, except the next line has a 0 instead of a 1. Also, you should change your regex pattern to " foobar$" instead of just foobar. – Umang Aug 17 '10 at 13:21
That's true. My fault, in my system there is no line with 0, but it should be a rare happening. I update the answer just in case. – Javier Rivera Aug 17 '10 at 16:14

See this answer on unix.stackexchange.com for a solution that filters out stock packages.

share|improve this answer
Welcome to AskUbuntu! Whilst this may theoretically answer the question, it would be preferable to include the essential parts of the answer here, and provide the link for reference. – Oyibo Nov 5 '12 at 8:03

I found a great answer to this on a related question. It uses the release manifest for the default package install list.

I also found this duplicate question.

I would love to see this as a filter in the Ubuntu Software Center. In Windows "Add/Remove Programs" serves this purpose.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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