Як отримати список застарілих пакетів?


19

Я намагаюся знайти спосіб отримати список пакетів, які вже не доступні у сховищах, які я включив. Ця робоча станція пройшла досить багато версій Ubuntu і додала та вилучила багато сторонніх сховищ. Я хотів би отримати список програмного забезпечення, яке я маю з цих видалених сховищ, щоб я міг його очистити або додати відповідні сховища.

Відповіді:


23
aptitude search '~o'

У Aptitude доступні дуже потужні пошуки. На жаль, синтаксис трохи громіздкий, і вам доведеться перекопати сторінку сторінки, щоб знайти документацію, але вона того варта.

apt-show-версії також можуть бути корисними:

apt-show-versions | grep 'No available version'

1
дивіться приємну статтю про застарілі пакунки тут: raphaelhertzog.com/2011/02/07/…
Lluís

Ще один корисний список створенийapt-show-versions | grep "newer than version in archive"
Шон

Я думаю, що влучні-шоу-версії є найкращими просто тому, що лінія придатності надзвичайно контр-інтуїтивно запам'ятована. Кожен раз, коли мені це потрібно, я мушу шукати його в Google / шукати його / зберігати / робити сценарій / тощо.
j riv

6

Щоб отримати список програм, які не знаходяться в зареєстрованому сховищі або PPA, зробіть це:

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

Це має вивести текст так:

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

Для мене це спрацювало, і показали три програми, які я встановив за допомогою пакетів DEB, і вони не були доступні в Repo або PPA.

Пам'ятайте, хоча, що неможливо перевірити всі програми, лише ті, що пройшли dpkg. Наприклад, деякі програми встановлюються, просто витягуючи їх у потрібні папки, а інші використовують окремий сміттєвий інсталятор або скрипт. Тож найкращий спосіб - ви самі зберігаєте список застосованих програм будь-яким іншим способом, крім APT.


Працює для всіх моїх dpkgвстановлених локальних пакетів. Один виняток. У ньому перераховано skype-bin, тоді як apt-cache policy skype-binчітко показано репо-партнеру Canonical. Я не впевнений, що відбувається. Випуск мультиарха? Ще +1 для apt-show-versions!
gertvdijk

aptitude викликає ці "застарілі" пакети. Дивіться коментар про хроніт вище.
Хенк Полі

5

Якщо у вас встановлено вміння використовувати,

aptitude search '?obsolete'

або його коротка форма

aptitude search '~o'

Ось це вибірковий вихід

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

Перший символ кожного рядка вказує поточний стан пакета. Найпоширеніші штати:

  • p, це означає, що в системі не існує жодного сліду пакета,
  • c, тобто пакет було видалено, але його конфігураційні файли залишаються в системі,
  • я, тобто пакет встановлений, і
  • v, тобто пакет віртуальний.

Другий символ вказує на збережену дію, яка повинна бути виконана на пакеті, якщо така є, інакше відображається порожній пробіл. Найпоширеніші дії:

  • i, тобто пакет буде встановлений,
  • d, що означає, що пакет буде видалено, і
  • p, що означає, що пакет та файли його конфігурації будуть видалені.

Якщо третім символом є A, пакет автоматично встановлюється.

Повний перелік можливих прапорів стану та дій див. У розділі Доступ до інформації про пакет у посібнику щодо дозволу на придатність.


1
aptitude search ?obsoleteможе працювати в баші, але вам слід скористатисяaptitude search '?obsolete'
AB

Ви можете додати трохи деталей щодо розбору результатів?
Старійшина Гік

Чи "застарілий" відрізняється від "~ o"?
Шон

@Sean Ні, вони не відрізняються. ~ o - це коротка форма для? застарілого дійсно.
Деміс Пальма ツ

Цитати розбираються оболонкою. Я думаю, що АБ мав на увазі те, що ви не повинні пропускати дивні символи без націлювання в командному рядку, тому що ви не знаєте, що ваша оболонка буде робити з ними.
Шон

2

Починаючи з Ubuntu 19.10, можна також запустити

apt list ?obsolete

щоб отримати список застарілих пакетів.

Для будь-якого випуску ви можете використовувати такий 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)

Для цього не потрібно встановлювати додаткові пакети, плюс це відносно швидко. Це також знайде частково встановлені пакети (але не знайде тих, у яких залишилися лише файли конфігурації; які можна було легко змінити). Примітка: це неважливо, для якої архітектури пакують пакети.

Якщо ви хочете включити пакети, у яких інстальована інша версія, ніж наявна у сховищах, ви можете зробити одне з наступного:

Використовуйте сучасні підходи:

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

Ще один варіант - запустити

ubuntu-support-status --show-unsupported

і прочитайте назви пакунків у розділі "Більше не завантажуються:".


'apt list - встановлений вручну | grep -v cosmic 'показує помилкові позитиви. Ця відповідь набагато краща!
TamusJRoyce

1
@TamusJRoyce, так, я вважаю, що зараз після редагування.
jarno

1

Більше інформації для розслідування.

ubuntu-підтримка-статус 
echo "$ (sudo apt-mark showmanual | wc -l) пакети, позначені як" встановлено вручну "."

... ubuntu-support-status та apt-mark можуть потребувати встановлення.


Немає необхідності використовувати sudoз apt-mark showmanual.
jarno

ubuntu-support-statusперелічує кількість застарілих пакетів, але не назви пакетів.
jarno

1
Прочитайте вихідubuntu-support-status --help
Ханну,

О, дякую за підказку.
jarno

0

Можливо, є більш чистий спосіб, але вгорі голови ви можете це зробити

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

Очистіть перші кілька рядків installedфайлу: у ньому будуть заголовки.

Бонус, якщо хтось може виправити моє виділення синтаксису ...


2
якщо ви збираєтеся використовувати результат dpkg -lдля отримання списку встановлених пакетів, вам слід обмежити результати рядками з "я" у другому стовпці, оскільки dpkg також перелічить пакунки, які не встановлені (можливо, вилучені, але не очищені) . Наприклад, змінивши першу команду, dpkg -l | grep '^.[^i]' | cut -f 3 -d ' ' вона буде повертати список пакетів, які НЕ встановлені. (але колись були)
тушкуйте

1
також apt-cache search someinstalledpackageповерне щось, навіть якщо пакет не буде доступний у репо, тому я не вірю, що це взагалі спрацює.
тушковане

1
@stew Я залишу це тут, щоб побачити, чи хтось зробить висновки, але ваша відповідь, безумовно, набагато краще. +1 вам.
Джефф Ферланд

@stew dpkg -l | grep '^.[^i]' | cut -f 3 -d ' 'також друкує деякі рядки заголовка.
jarno

Навіть якби ця відповідь спрацювала, вона була б дуже повільною, оскільки працювала б apt-cache searchдля кожного пакету окремо.
jarno

0

Як уже згадувалося, пошук apt-get - це не гарний метод перевірити, чи пакет ще доступний. Додатково Я додав все лише до одного рядка:

for i in `dpkg -l | grep '^i' | awk '{ print $2 }'`; do apt-cache show $i > /dev/null || echo $i; done

І чомуgrep '^i'
AB

@AB хороший момент; це не вказує, чи встановлений пакет, але бажана дія пакета. Див. Для man dpkg-queryотримання додаткової інформації.
jarno

Це дуже повільно
jarno

apt-cache showЦе не є корисним для перевірки наявності пакету. Якщо ви вимкнете відповідний сховище, і його немає в інших увімкнених сховищах, він все одно відображатиме пакет.
jarno
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.