Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I'm in search for something analog to this question: Zypper: How do I display all packages from a certain repository?

Since I'm on Ubuntu, I need an aptitude based solution: How can I get a list of installed packages from a certain repository?

share|improve this question

7 Answers 7

up vote 4 down vote accepted

Using aptitude, in order to look for installed packages outside of the stable branch, you can use:

aptitude search "?narrow(?installed,?not(?archive(stable)))"

To see versions as well as package-names (and instead of descriptions) you can use the command with the format option (-F for short), as follows.

aptitude search -F "%p %V %v" "?narrow(?installed,?not(?archive(stable)))"

For more formats, please take a look at the manpage (here's documentation with avail. options).

That works for example, in Debian if you installed packages outside Squeeze (by runing, for example, apt-get install -t sid package-name.

You can look where an installed package comes from via apt-cache policy, usage is as follows:

apt-cache policy <package-name>

For example, my python-numpy package renders the following output:

$ LANG=C apt-cache policy python-numpy
python-numpy:
  Installed: 1:1.6.2-1
  Candidate: 1:1.6.2-1.2
  Version table:
     1:1.7.0-1 0
          1 http://ftp.es.debian.org/debian/ experimental/main amd64 Packages
     1:1.6.2-1.2 0
        500 http://ftp.es.debian.org/debian/ sid/main amd64 Packages
 *** 1:1.6.2-1 0
        100 /var/lib/dpkg/status
     1:1.4.1-5 0
        990 http://ftp.es.debian.org/debian/ squeeze/main amd64 Packages
        990 http://ftp.de.debian.org/debian/ squeeze/main amd64 Packages

That means that I'm one version behind current sid/main's branch, so I have an old-sid version installed. I see I don't have the stable one because it is yet 1.4.1-5, and I'm currently at 1.6.2-1.

At time of submittal this package was already updated : )

share|improve this answer
    
I prefer ?any-version(), because ~narrow(pat1, pat2) is the same as ?any-version(pat1 pat2) and it supports ?any-version(pat1 pat2 pat3) without looking stupid. –  Robert Siemer Mar 15 at 18:04

After reading info page of aptitude and a dozen of attempts, I finally got this :

aptitude search '?narrow(?installed,?not(?archive(testing)) ?archive(unstable))'

or (equivalent) :

aptitude search '~S ~i (!~Atesting ~Aunstable)'

It will search packages installed from unstable archives of any repository. You have to filter out packages from your default archive (testing in above example).

If you want to filter packages installed from www.debian-multimedia.org/unstable :

aptitude search '~S ~i (!~Atesting ~Aunstable ?origin("Unofficial Multimedia Packages"))

Edit: “Archive”, “origin” etc. are deducted from the Release file of the repository. Unfortunately not all tools can look at all those lines and they use different syntax for them. You can find those files as /var/lib/apt/lists/*Release. Or just type apt-cache policy to get an overview. apt-cache changed its output format: later versions use apt_preferences style.

  • Suite: or Archive: (old name!)
    • aptitude search: ?archive(___) or ~A___
    • aptitude format: %t
    • apt_preferences: release a=___
    • Ubuntu examples: natty-backports, trusty-security, stable
  • Origin:
    • aptitude search: ?origin(___) or ~O___
    • aptitude format: n/a
    • apt_preferences: release o=___
    • Ubuntu examples: Canonical, Google, Inc., LP-PPA-dockbar-main, Ubuntu
  • all other lines
    • aptitude: n/a
share|improve this answer

Examine the origin tag (such as o=Debian) for each of your current repositories:

apt-cache policy | sed -n 's/.*o=\([^,]\+\).*/\1/p' | uniq

Then search for packages from (or not from) a particular origin:

aptitude search "?installed?origin(Debian)"
aptitude search "?installed?not(?origin(Debian))"

This is not suitable for a security audit because it relies on each repository to provide its own origin information, but it might be helpful for troubleshooting the origin of packages that are present in multiple repositories.

share|improve this answer
1  
Your aptitude search patterns are not good. – They select like this “list packages where one version is installed, and any other version exists in Debian” or “some version installed, and at least one version of that package available on non-Debian”. – What we look for is “the version installed is from Debian (or not)”. This has to be done with ?narrow() or ?any-version(). –  Robert Siemer Jan 26 at 5:09
    
Confirmed. I've installed nemo-fileroller from linuxmint, but it exists in Debian, too. So it appears in the list, because it's installed and exists somewhere from Debian. –  Boldewyn Mar 11 at 9:44

For completeness: On Ubuntu systems you can use Synaptic for this task, too. In the left column you can filter packages by their origin.

share|improve this answer
    
I was trying to do this and found this SU post via Google, can't believe I overlooked Synaptic, thanks! –  David Claridge Nov 27 '10 at 20:33
    
@RobertSiemer It might have slipped your attention, that I accepted it after two days w/o sufficient answer, and before any of the other answers dropped in. I accepted it, because it solved my problem. I also upvoted all later answers, but, I beg your pardon, never changed the state of acceptness. You will also note on this site’s FAQ, that I haven't drawn any reputation gains from this move, where in fact I've lost 2 reps for not accepting someone else's answer. So please take a step back in the future before judging someone's decisions in plain public and rethink the possible causes. –  Boldewyn Jan 26 at 20:47

I've found this :

aptitude search "?origin (<repository>) ?installed"

You can also find a list of search terms supported by "aptitude search" here.

share|improve this answer
    
Why do you need to run this with sudo ? It seems to me that this also works without running it as root. –  Andre Holzner Dec 4 '10 at 17:15
    
It doesn't need to be run with sudo –  Kurtis Nusbaum Aug 4 '12 at 15:13
    
As I commented on @Anonymous answer, this does not have the desired effect. –  Robert Siemer Mar 11 at 5:05

I tried to look up how to list all packages from a specific repository, but I'm not familiar enough with how apt works to figure it out.

Once you find a list of all packages from a specific repository, however, you can put the names of all the packages in a file named filename, and then run

dpkg --get-selections | grep -f 'filename'

to list all the installed packages out of that list. Sorry I couldn't be of more help.

share|improve this answer
    
Thanks for the try, but it doesn't help a bit without the knowledge, where a package came from. –  Boldewyn Apr 20 '10 at 18:48
    
I beg you, delete this non-answer. –  Robert Siemer Jan 26 at 4:52

First, find the appropriate file(s) for the repository of interest in /var/lib/apt/lists. It should be possible to do this programmatically, but I haven't needed to do so.

Using google chrome as an example, try this:

SEARCH_PATTERN=dl.google.com_linux_chrome  # adjust to suit your needs

for PKG in $( grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages | sed 's/^Package: //' )
do
    if dpkg -s "${PKG}" 2> /dev/null 1> /dev/null
    then
        echo ${PKG}
    fi
done

and I get the output:

google-chrome-stable

dpkg -s returns 0 if the package is installed and nonzero otherwise. For future reference purposes, the output of

grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages

was

Package: google-chrome-beta
Package: google-chrome-stable
Package: google-chrome-unstable
share|improve this answer
    
...does this use aptitude? –  Robert Siemer Jan 26 at 5:19

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.