Список (рекурсивных) зависимостей установленных пакетов в APT


17

Для каждого установленного пакета я хотел бы знать, какие пакеты будут установлены, если я его деинсталлирую. Пример вывода мне нужен ( package: list of deps):

abc: foo bar
bcd: baz abc
bdd: baz fuubar

Append

Если я проверю, что действительно будет удалено, если я удалю пакет, pppиспользуя apt-get:

$ echo $(apt-get --dry-run remove ppp | grep '^Remv ' | cut -d' ' -f2)
gnome-ppp mint-meta-xfce network-manager-pptp-gnome network-manager-pptp wvdial pppoeconf pppoe pptp-linux pppconfig ppp

Я вижу, что это отличается от того, что apt-cacheдает мне шоу (которое я не считаю рекурсивными зависимостями):

$ apt-cache show ppp | grep '^Breaks: '
Breaks: network-manager (<= 0.8.0.999-1), network-manager-pptp (<= 0.8.0.999-1), pppdcapiplugin (<= 1:3.9.20060704+dfsg.1-1)

Добавить 2

Это dpkg --get-selections | cut -f1надежный способ получить список установленных пакетов для перебора?


1
Разбор apt-get --dry-run removeвыглядит в принципе правильно. Он может пропустить некоторые автоматически установленные пакеты, которые нужны только для автоматически установленных пакетов, которые нужны только для удаляемого вами пакета. Вот почему вы не считаете это подходящим ответом?
Жиль "ТАК - перестань быть злым"

Ответы:


11

Вы задали здесь несколько разных вопросов, надеюсь, я смогу помочь хотя бы один или два.

Чтобы dpkgвывести список всех установленных пакетов, используйте для вывода в список, разделенный полями

dpkg -l 

Чтобы просто получить список пакетов, без дополнительных полей, так что вы можете передать его в другом месте.

dpkg -l | awk '{print $2 }' # Pipe to grep after the awk, or glob from dpkg

Например, если я хочу удалить старое ядро,

apt-get purge `dpkg -l linux* | awk '{print $2}' | grep 3.0.0-12`

Самый простой способ пройти через все ненужные зависимости - с debfoster. Он работает в интерактивном режиме и просматривает то, что вы хотите, их зависимости и может удалить или перечислить то, что не является рекурсивной зависимостью.

Чтобы вывести список всех рекурсивных зависимостей определенного пакета,

debfoster -d $PACKAGE ## PACKAGE is the specific package.

После того, как вы выполнили, debfosterвы можете проверить любых иждивенцев, которые есть у пакета,

debfoster -e $PACKAGE ## PACKAGE is the specific package.

Действительно отличный способ перечислить «осиротевшие» пакеты, это с deborphan. Запустите deborphanбез параметров, и в нем будут перечислены все «потерянные» пакеты. «Сирота» - это пакет, от которого ничего не зависит, и вы явно его не установили.

Я также люблю чистить любые «потерянные» пакеты после новой установки. После того, как я удалил определенные пакеты, вы можете получить что-нибудь пропущенное с apt-get autoremove --purgeпомощью,

apt-get purge `deborphan`

Наконец, иногда вы этого не делаете --purgeи в итоге получаете пакет «остатки», более новые версии apt-getмогут автоматически удалять их. Чтобы удалить все «остатки» из запущенных неустановленных пакетов,

apt-get autoclean

Если у вас нет новой версии apt-get, вы всегда можете удалить их с помощью этих команд. Они выдают ошибку, если не существует «оставшихся» файлов, кажется, что autoclean может пропустить некоторые из них в любом случае.

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs dpkg --purge

Дебфостер все еще существует, но считается, что он заменен чертами способностей
Джошуа Клейтон,

4
apt-cache show pkgname1 pkgname2...

(среди прочего) перечислит эти (во время выполнения) зависимости. Обычно этого достаточно, если только вы не подаете его на станок для дальнейшей обработки. Если вы хотите именно в том формате, который вы указали, вам, вероятно, придется написать скрипт.


Извините, я неправильно сформулировал свой вопрос. Мне интересно знать, какие пакеты будут удалены для каждого установленного мной пакета. И мне также нужно перечислить все пакеты, которые я установил.
Удалено

2
@Deleted: Извините, я не видел этот комментарий до сих пор. В ответ на «какие пакеты будут удалены для каждого пакета, который я установил» (я полагаю, вы хотите, чтобы на этот вопрос отвечали отдельно для каждого пакета), попробуйте apt-get remove -s packagename. Список всех установленных вами пакетов просто dpkg -l.
Фахим Митха

@FaheemMitha: старый пост, но все же отличный совет apt-get remove -s packagename!
twan163

@ twan163 Рад, что это было полезно для вас.
Фахим Митха

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