Список (рекурсивных) зависимостей установленных пакетов в 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выглядит в принципе правильно. Он может пропустить некоторые автоматически установленные пакеты, которые нужны только для автоматически установленных пакетов, которые нужны только для удаляемого вами пакета. Вот почему вы не считаете это подходящим ответом?
Жиль "ТАК - перестань быть злым"
связанные: askubuntu.com/questions/468753/recursive-dependencies
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件 事件

Ответы:

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 Рад, что это было полезно для вас.
Фахим Митха
1

Я думаю, вам нужно продолжить и создать цикл для того же:

apt-cache depends libtext-wrapi18n-perl |xargs apt-cache depends

Конечно удалите заголовки.

Персидский залив
источник
2
У apt-cache есть опция recuresapt-cache depends --recurse libtext
Джошуа Клэйтон,