I installed many packages from many PPAs on my system. I want to list all the installed packages which are installed from launchpad PPAs, not repositories.
Is this possible through command-line?
I installed many packages from many PPAs on my system. I want to list all the installed packages which are installed from launchpad PPAs, not repositories.
Is this possible through command-line?
The following command returns the package name and its ppa (if installed from a ppa):
apt-cache policy $(dpkg --get-selections | grep -v deinstall$ | awk '{ print $1 }') | perl -e '@a = <>; $a=join("", @a); $a =~ s/\n(\S)/\n\n$1/g; @packages = split("\n\n", $a); foreach $p (@packages) {print "$1: $2\n" if $p =~ /^(.*?):.*?500 http:\/\/ppa\.launchpad\.net\/(.*?)\s/s}'
Details:
dpkg --get-selections gives only the installed packages after grep -v deinstall$awk '{ print $1 }' returns only the package nameperl -e '@a = <>; $a=join("", @a)' concatenates all the lines returned by apt-cache policy$a =~ s/\n(\S)/\n\n$1/g; adds a newline between each package section@packages = split("\n\n", $a); is a perl array containing all the packages infos, one package per item.foreach $p (@packages) {print "$1: $2\n" if $p =~ /^(.*?):.*?500 http:\/\/ppa\.launchpad\.net\/(.*?)\s/s} is a loop where the package and the ppa are printed if a ppa with prio 500 is found in the policy.Some legacy tools like aptitude have very useful search feature. synaptic (GUI) too has filter by Origin feature (Already listed as another answer here).
aptitude command below shows list of installed packages for active PPA's in sources.list.
aptitude search '?narrow(?installed, ~Oppa)'
~Oppa means Origin contains 'ppa'
Reference: aptitude - Search term reference
In case PPA repository was removed, packages become obsolete (No Origin repository listed in APT lists). Alternatively use this filter instead ~Oppa | -o
aptitude search '?narrow(?installed, ~Oppa | -o)'
The source of an installed package can be checked using apt-cache, for example
$ apt-cache policy oracle-java7-installer
oracle-java7-installer:
Installed: 7u51-0~webupd8~7
Candidate: 7u51-0~webupd8~7
Version table:
*** 7u51-0~webupd8~7 0
500 http://ppa.launchpad.net/webupd8team/java/ubuntu/ precise/main i386 Packages
100 /var/lib/dpkg/status
The output of apt-cache policy <package_name> contains the source.
One can use the following script to obtain the list of packages installed from PPAs.
#!/bin/bash
echo "List of packages which are not installed from Ubuntu repository"
for i in `dpkg -l | grep "^ii" | awk '{print $2}'`
do
j=`apt-cache policy "$i" | grep "ppa.launchpad.net"`
if [ $? -eq 0 ]; then
echo "$i"
#echo "$i $j"
fi
done
Install synaptic. You can then browse packages by "origin" or even any other custom filter.
In accordance with this answer and this post, you can get a list of all packages from all the PPAs installed on your system using the following bash code:
for APT in $(find /etc/apt/ -name \*.list); do
grep -o "^deb http://ppa.launchpad.net/[a-z0-9\-]\+/[a-z0-9\-]\+" $APT | while read ENTRY ; do
USER=$(echo $ENTRY | cut -d/ -f4)
PPA=$(echo $ENTRY | cut -d/ -f5)
awk '$1 == "Package:" { if (a[$2]++ == 0) print $2; }' /var/lib/apt/lists/*$USER*$PPA*Packages
done
done
And in accordance with this answer, you can get a list of all installed packages in your system using:
dpkg --get-selections | grep -v deinstall | cut -f1
Now, let's join these two ideas to get a list of all the packages which are installed from PPAs:
(for APT in $(find /etc/apt/ -name \*.list); do
grep -o "^deb http://ppa.launchpad.net/[a-z0-9\-]\+/[a-z0-9\-]\+" $APT | while read ENTRY ; do
USER=$(echo $ENTRY | cut -d/ -f4)
PPA=$(echo $ENTRY | cut -d/ -f5)
awk '$1 == "Package:" { if (a[$2]++ == 0) print $2; }' /var/lib/apt/lists/*$USER*$PPA*Packages
done
done; dpkg --get-selections | grep -v deinstall | cut -f1) | sort | awk 'dup[$0]++ == 1'
I wanted to know how many packages I had from each ppa, so I slightly modified Sylvain's awesome answer:
apt-cache policy $(dpkg --get-selections | grep -v deinstall$ | awk '{ print $1 }') \
| perl -e '@a = <>; $a=join("", @a); $a =~ s/\n(\S)/\n\n$1/g; @packages = split("\n\n", $a); foreach $p (@packages) {printf "%-40s %s\n", $2, $1 if $p =~ /^(.*?):.*?500 http:\/\/ppa\.launchpad\.net\/(.*?)\s/s}' \
| sort \
| uniq -c -w 40
by printing ppa first and using only first 40 characters to count & deduplicate with uniq, I can get this kind of output:
5 alexlarsson/flatpak/ubuntu flatpak
147 bleedingedge/focal-bleed/ubuntu bzip2
1 justinabrahms/ttf-cascadia-code/ubuntu ttf-cascadia-code
44 libreoffice/ppa/ubuntu fonts-opensymbol
71 savoury1/backports/ubuntu bash
41 savoury1/multimedia/ubuntu dav1d
8 strukturag/libheif/ubuntu aom-tools
12 ubuntugis/ubuntugis-unstable/ubuntu gdal-bin