Перелічіть (рекурсивні) залежності встановлених пакетів у APT


17

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

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

Додавати

Якщо я перевіряю, що дійсно буде видалено, якщо я видаляю пакунок, 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, ви завжди можете їх видалити за допомогою цих команд. Вони помиляються, якщо не існує файлів, що залишились, здається, що авточистка може іноді пропускати деякі, незалежно.

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

debfoster все ще існує, але його вважають витісненим з особливостей у придатності
— Джошуа Клейтон

4
apt-cache show pkgname1 pkgname2...

буде (серед іншого) перераховувати ці (час виконання) залежності. Зазвичай це достатньо, якщо ви не подаєте його до машини для подальшої обробки. Якщо ви хочете його в точно вказаному вами форматі, вам, мабуть, доведеться написати сценарій.


Вибачте, я сформулював своє запитання неправильно. Мені цікаво знати, які пакунки будуть видалені для кожного встановленого пакету. І мені також потрібно перелічити всі встановлені пакети.
— Видалено

2
@Deleted: Вибачте, я ще не бачив цього коментаря. У відповідь на те, "які пакети будуть видалені для кожного встановленого пакету" (я вважаю, що ви хочете, щоб на це питання відповідали за кожний пакет), спробуйте apt-get remove -s packagename. Перерахувати всі встановлені вами пакети просто dpkg -l.
— Faheem Mitha

@FaheemMitha: старий пост, але все ще чудова порада apt-get remove -s packagename!
— twan163

@ twan163 Щасливий, тобі це було корисно.
— Faheem Mitha

1

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

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

Звичайно, видаліть заголовки.


2
apt-кеш-пам'ять має можливість виборуapt-cache depends --recurse libtext
— Джошуа Клейтон,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.