Перелічіть (рекурсивні) залежності встановлених пакетів у 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.