Как перечислить все пакеты, которые установлены из PPA?


23

Я установил много пакетов из многих PPA в моей системе. Я хочу перечислить все установленные пакеты, которые установлены из PPA панели запуска, а не из репозиториев.

Это возможно через командную строку?


Возможно дублирование? askubuntu.com/questions/43581/…
Митч

Нет, это другой.
Авинаш Радж

1
Не утилита командной строки, но очень полезен Y PPA Manager . Перечисляет, устанавливает и удаляет пакеты из PPA.
Jos

Ответы:


23

Следующая команда возвращает имя пакета и его ppa (если установлено из 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}'

Детали:

  • dpkg --get-selections выдает только установленные пакеты после grep -v deinstall$
  • awk '{ print $1 }' возвращает только имя пакета
  • perl -e '@a = <>; $a=join("", @a)' объединяет все строки, возвращаемые apt-cache policy
  • $a =~ s/\n(\S)/\n\n$1/g; добавляет новую строку между каждым разделом пакета
  • @packages = split("\n\n", $a); является массивом perl, содержащим всю информацию о пакетах, по одному пакету на элемент
  • foreach $p (@packages) {print "$1: $2\n" if $p =~ /^(.*?):.*?500 http:\/\/ppa\.launchpad\.net\/(.*?)\s/s} является циклом, в котором пакет и ppa печатаются, если в политике обнаружен ppa с prio 500.

Короткий ответ / код, долгое время выполнения.
Раду Рэдяну

@Avinash: ты проверил мой ответ? Если да, то не могли бы вы принять его? Спасибо.
Сильвен Пино


3

В соответствии с этим ответом и этим постом вы можете получить список всех пакетов из всех PPA, установленных в вашей системе, используя следующий код bash:

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

Теперь давайте объединим эти две идеи, чтобы получить список всех пакетов, которые установлены из PPA:

(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'

3

Источник установленного пакета может быть проверен apt-cache, например, с помощью

$ 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

Вывод apt-cache policy <package_name>содержит источник.

Для получения списка пакетов, установленных из PPA, можно использовать следующий скрипт.

#!/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

1
Это не работает, если вы выбрали другое зеркало. Например, у меня естьgir1.2-syncmenu-0.1 500 http://ubuntu.univ-nantes.fr/ubuntu/ saucy/main amd64 Packages
Сильвен Пино

В этом случае google-chrome-stableне устанавливается из PPA; это просто отдельный репозиторий.
Раду Рэдяну

Хорошо, я видел это. Но вы пришли с очень плохим примером, который может заставить начинающих пользователей думать, что если пакет не из репозиториев Ubuntu, то пакет из PPA. Вопрос ФП о PPA.
Раду Рэдяну

@ RaduRădeanu Я получил ваши очки и отредактировал свой пост. ты абсолютно прав.
souravc

Лучше сейчас, даже если есть проблема со временем выполнения, которое действительно затянуто.
Раду Рэдяну

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.