Jak uzyskać listę przestarzałych pakietów?

19

Próbuję znaleźć sposób, aby uzyskać listę pakietów, które nie są już dostępne w repozytoriach, które mam włączone. Ta stacja robocza przeszła kilka wersji Ubuntu i dodała i usunęła wiele repozytoriów stron trzecich. Chciałbym uzyskać listę oprogramowania, które mam z tych usuniętych repozytoriów, dzięki czemu mogę je wyczyścić lub dodać z powrotem odpowiednie repozytoria.

Sean
źródło

Odpowiedzi:

23
aptitude search '~o'

Aptitude ma dostępne bardzo potężne wyszukiwanie. Niestety składnia jest nieco nieporęczna i musisz przeszukać stronę podręcznika, aby znaleźć dokumentację, ale warto.

Pomocne mogą być również wersje apt-show:

apt-show-versions | grep 'No available version'
gulasz
źródło
1
zobacz fajny artykuł o przestarzałych pakietach tutaj: raphaelhertzog.com/2011/02/07/…
Lluís
Kolejną przydatną listę generujeapt-show-versions | grep "newer than version in archive"
Sean
Myślę, że wersje apt-show są najlepsze po prostu dlatego, że linia umiejętności jest wyjątkowo sprzeczna z intuicją. Za każdym razem, gdy go potrzebuję, muszę google go / wyszukać / zapisać / zrobić skrypt / etc.
j riv
6

Aby uzyskać listę aplikacji, które nie znajdują się w zarejestrowanym repozytorium lub PPA, wykonaj następujące czynności:

sudo apt-get install apt-show-versions
apt-show-versions | grep 'No available version'

To powinno wypisać tekst w ten sposób:

app1 1.0.0.14 installed: No available version in archive
app23 0.3.6 installed: No available version in archive
app332 7.0.9377 installed: No available version in archive

Dla mnie to zadziałało i pokazało trzy aplikacje, które zainstalowałem przy użyciu pakietów DEB i nie były dostępne w Repo ani PPA.

Pamiętaj jednak, że nie można sprawdzić wszystkich programów, tylko tych, które przeszły dpkg. Na przykład niektóre aplikacje są instalowane przez rozpakowanie ich do odpowiednich folderów, a inne wykorzystują autonomiczny pojemnik lub skrypt instalatora. Najlepszym sposobem jest więc zachowanie listy aplikacji zainstalowanych za pomocą dowolnej metody innej niż APT.

japzone
źródło
Działa dla wszystkich moich lokalnych dpkgzainstalowanych pakietów. Jeden wyjątek. Wymienia skype-bin, podczas gdy apt-cache policy skype-binwyraźnie pokazuje repozytorium partnerów Canonical. Nie jestem pewien, co się dzieje. Problem z wieloma stronami? Nadal +1 za apt-show-versions!
gertvdijk
aptitude nazywa te „przestarzałe” pakiety. Zobacz komentarz dotyczący chronitis powyżej.
Henk Poley,
5

Jeśli masz zainstalowane aptitude ,

aptitude search '?obsolete'

lub jego krótka forma

aptitude search '~o'

Oto przykładowy wynik

i A gcc-4.7-base - GCC, the GNU Compiler Collection (base package)
id  libdb4.7     - Berkeley v4.7 Database Libraries [runtime]
i   libudev0     - libudev shared library

Pierwszy znak każdej linii wskazuje aktualny stan paczki. Najczęstsze stany to:

  • p, co oznacza, że ​​w systemie nie ma śladu pakietu,
  • c, co oznacza, że ​​pakiet został usunięty, ale jego pliki konfiguracyjne pozostają w systemie,
  • i, co oznacza, że ​​pakiet jest zainstalowany, oraz
  • v, co oznacza, że ​​pakiet jest wirtualny.

Drugi znak wskazuje zapisaną akcję do wykonania na pakiecie, jeśli taka istnieje, w przeciwnym razie wyświetlana jest pusta spacja. Najczęstsze działania to:

  • i, co oznacza, że ​​pakiet zostanie zainstalowany,
  • d, co oznacza, że ​​pakiet zostanie usunięty, oraz
  • p, co oznacza, że ​​pakiet i jego pliki konfiguracyjne zostaną usunięte.

Jeśli trzecim znakiem jest A, pakiet został zainstalowany automatycznie.

Aby uzyskać pełną listę możliwych flag stanu i akcji, zobacz sekcję Uzyskiwanie dostępu do informacji o pakiecie w przewodniku referencyjnym aptitude.

Demis Palma ツ
źródło
1
aptitude search ?obsoletemoże działać w trybie bash, ale powinieneś użyćaptitude search '?obsolete'
AB
czy możesz dodać trochę szczegółów na temat analizowania wyników?
Elder Geek
Czy „? Przestarzałe” różni się od „~ o”?
Sean
@Sean Nie, nie różnią się. ~ o to skrót od rzeczywiście? przestarzały.
Demis Palma ツ
Cytaty są analizowane przez powłokę. Myślę, że AB miał na myśli to, że nie powinieneś przekazywać dziwnych znaków bez zmian w linii poleceń, ponieważ nie wiesz, co zrobi z nimi twoja powłoka.
Sean
2

Począwszy od wersji Ubuntu 19.10 można również uruchomić

apt list ?obsolete

aby uzyskać listę przestarzałych pakietów.

W każdym wydaniu możesz użyć następującego linijki Bash:

comm -23 <(dpkg-query -W -f '${db:Status-Abbrev}\t${Package}\n' | grep '^.[^nc]' | cut -f2 | sort) <(apt-cache dumpavail | sed -rn 's/^Package: (.*)/\1/p' | sort -u)

Nie ma potrzeby instalowania dodatkowych pakietów do tego, a to jest stosunkowo szybkie. Znajduje to również częściowo zainstalowane pakiety (ale nie znajdzie tych, w których pozostały tylko pliki konfiguracyjne; można je jednak łatwo zmienić). Uwaga: nie ma znaczenia, jaką architekturą są pakiety.

Jeśli chcesz dołączyć pakiety, które mają zainstalowaną inną wersję niż dostępna z repozytoriów, możesz wykonać jedną z następujących czynności:

Użyj nowoczesnego apt:

 apt list --installed | awk -F/ '/\[installed,local\]/{print $1}'

Jeszcze inną opcją jest uruchomienie

ubuntu-support-status --show-unsupported

i przeczytaj nazwy pakietów w sekcji „Nie można już pobrać:”.

jarno
źródło
'lista apt - zainstalowane ręcznie | grep -v cosmic 'pokazuje fałszywe alarmy. Ta odpowiedź jest znacznie lepsza!
TamusJRoyce
1
@TamusJRoyce, tak, chyba teraz po edycji.
jarno
1

Więcej informacji do zbadania.

status wsparcia ubuntu 
echo „$ (sudo apt-mark showmanual | wc -l) pakiety oznaczone jako„ zainstalowane ręcznie ”.”

... status Ubuntu-support i apt-mark mogą wymagać instalacji.

Hannu
źródło
Nie musisz używać sudoz apt-mark showmanual.
jarno
ubuntu-support-statuswyświetla liczbę przestarzałych pakietów, ale nie nazwy pakietów.
jarno
1
Przeczytaj wynikiubuntu-support-status --help
Hannu
Dzięki za podpowiedź.
jarno
0

Może być czystszy sposób, ale możesz to zrobić z czubka mojej głowy

dpkg -l | cut -f 3 -d ' ' > installed
xargs -n 1 --replace=X apt-cache search ^X$ < installed | cut -f 1 -d ' ' > available
diff installed available

Wyczyść kilka pierwszych wierszy installedpliku: będzie miał nagłówki.

Premia, jeśli ktoś może naprawić podświetlanie składni ...

Jeff Ferland
źródło
2
jeśli zamierzasz użyć danych wyjściowych dpkg -ldo uzyskania listy zainstalowanych pakietów, powinieneś ograniczyć wyniki do linii z „i” w drugiej kolumnie, ponieważ dpkg wyświetli również listę pakietów, które nie są zainstalowane (być może usunięte, ale nie usunięte) . jako przykład, zmiana pierwszego polecenia na dpkg -l | grep '^.[^i]' | cut -f 3 -d ' ' to, że zwróci listę pakietów, które NIE są zainstalowane. (ale kiedyś były)
gulasz
1
także apt-cache search someinstalledpackagepowróci coś nawet jeśli pakiet nie jest dostępny z repo, więc nie wierzę, to praca będzie w ogóle.
gulasz
1
@stew Zostawię to tutaj, aby zobaczyć, czy ktoś dojdzie do wniosków, ale twoja odpowiedź jest zdecydowanie lepsza. +1 dla ciebie.
Jeff Ferland
@stew dpkg -l | grep '^.[^i]' | cut -f 3 -d ' 'drukuje również niektóre linie nagłówka.
jarno
Nawet jeśli ta odpowiedź zadziała, byłaby bardzo wolna, ponieważ działałaby apt-cache searchdla każdego pakietu osobno.
jarno
0

Jak wspomniano, wyszukiwanie apt-get nie jest dobrą metodą sprawdzenia, czy pakiet jest nadal dostępny. Dodatkowo dodałem wszystko do jednej linii:

for i in `dpkg -l | grep '^i' | awk '{ print $2 }'`; do apt-cache show $i > /dev/null || echo $i; done
wof
źródło
I dlaczegogrep '^i'
AB
@AB dobry punkt; nie mówi to, czy pakiet jest zainstalowany, ale że ma zostać zainstalowane żądane działanie pakietu. Zobacz man dpkg-querywięcej informacji.
jarno
To jest bardzo wolne
jarno
apt-cache shownie sprawdza się również, czy pakiet jest dostępny. Jeśli wyłączysz odpowiednie repozytorium, a żadne inne włączone repozytorium go nie ma, nadal wyświetla pakiet.
jarno