Wyświetla (rekurencyjne) zależności zainstalowanych pakietów w APT

17

Dla każdego zainstalowanego pakietu chciałbym wiedzieć, które pakiety zostaną zainstalowane, jeśli go odinstaluję. Przykładem danych wyjściowych, których potrzebuję, jest ( package: list of deps):

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

Dodać

Jeśli sprawdzę, co naprawdę zostanie usunięte, jeśli usunę pakiet pppza pomocą 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

Widzę, że różni się od tego, co apt-cachedaje mi program (który moim zdaniem nie obejmuje zależności rekurencyjnych):

$ 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)

Dołącz 2

Czy dpkg --get-selections | cut -f1to niezawodny sposób na uzyskanie listy zainstalowanych pakietów do iteracji?

Usunięte
źródło
1
Analiza składni apt-get --dry-run removewygląda w zasadzie poprawnie. Może brakować niektórych automatycznie zainstalowanych pakietów, które są potrzebne tylko w przypadku automatycznie zainstalowanych pakietów, które są potrzebne tylko dla usuniętego pakietu. Czy dlatego nie uważasz, że to odpowiednia odpowiedź?
Gilles „SO- przestań być zły”
powiązane: askubuntu.com/questions/468753/recursive-dependencies
Ciro Santilli 20 改造 中心 法轮功 六四 事件

Odpowiedzi:

11

Zadałeś tutaj kilka różnych pytań, mam nadzieję, że mogę przynajmniej pomóc w jednym lub dwóch.

Aby wyświetlić listę wszystkich zainstalowanych pakietów, użyj, dpkgaby wyprowadzić listę rozdzieloną polami

dpkg -l 

Aby uzyskać listę pakietów, bez dodatkowych pól, aby można było przesłać ją gdzie indziej.

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

Na przykład, jeśli chcę usunąć stare jądro,

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

Najłatwiejszym sposobem przejścia przez wszystkie niepotrzebne zależności jest użycie debfoster. Działa interaktywnie i przechodzi przez to, co chcesz, ich zależności i może usunąć lub wymienić, co nie jest zależnością rekurencyjną.

Aby wyświetlić wszystkie rekurencyjne zależności określonego pakietu,

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

Po wykonaniu debfostermożesz również sprawdzić wszystkie zależności, które posiada pakiet,

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

Naprawdę świetny sposób na wyświetlenie listy „osieroconych” pakietów deborphan. Uruchom deborphanbez opcji, a wyświetli się lista wszystkich „osieroconych” pakietów. „Osierocony” to pakiet, od którego nic nie zależy, a nie został on wyraźnie zainstalowany.

Lubię też czyścić wszelkie „osierocone” pakiety po nowej instalacji. Po usunięciu określonych pakietów możesz uzyskać wszystko, czego brakuje apt-get autoremove --purge,

apt-get purge `deborphan`

W końcu czasem tego nie robisz --purgei kończysz na „resztkach” pakietu, nowsze wersje apt-getmogą je automatycznie usunąć. Aby usunąć wszystkie „resztki” z odinstalowanych pakietów, uruchom:

apt-get autoclean

Jeśli nie masz nowej wersji apt-get, zawsze możesz je usunąć za pomocą tych poleceń. Występują błędy, jeśli nie istnieją żadne „resztkowe” pliki, wygląda na to, że autoclean może czasami pomijać niektóre pliki.

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs dpkg --purge
JM Becker
źródło
debfoster nadal istnieje, ale uważa się go za zastąpiony przez cechy umiejętności
Joshua Clayton
4
apt-cache show pkgname1 pkgname2...

wyświetli (między innymi) listę tych zależności (środowiska wykonawczego). Zazwyczaj jest to wystarczające, chyba że podajesz je do maszyny w celu dalszego przetwarzania. Jeśli chcesz mieć dokładnie taki format, jaki podałeś, prawdopodobnie będziesz musiał napisać skrypt.

Faheem Mitha
źródło
Przepraszam, sformułowałem moje pytanie niepoprawnie. Chcę wiedzieć, które pakiety zostaną odinstalowane dla każdego pakietu, który zainstalowałem. Muszę też wymienić wszystkie zainstalowane pakiety.
Usunięto
2
@Deleted: Przepraszamy, do tej pory nie widziałem tego komentarza. W odpowiedzi na „które pakiety zostaną odinstalowane dla każdego pakietu, który zainstalowałem” (zakładam, że chcesz odpowiedzieć na to pytanie dla poszczególnych pakietów) spróbuj apt-get remove -s packagename. Lista wszystkich zainstalowanych pakietów jest po prostu dpkg -l.
Faheem Mitha,
@FaheemMitha: stary post, ale nadal świetna wskazówka apt-get remove -s packagename!
twan163,
@ twan163 Szczęśliwy, że było to przydatne dla Ciebie.
Faheem Mitha,
1

Myślę, że musisz kontynuować i stworzyć pętlę dla tego samego:

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

Oczywiście usuń nagłówki.

Zatoka Perska
źródło
2
apt-cache depend ma opcję recuresapt-cache depends --recurse libtext
Joshua Clayton