Как получить список устаревших пакетов?

19

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

Шон
источник

Ответы:

23
aptitude search '~o'

У Aptitude есть очень мощный поиск. К сожалению, синтаксис немного громоздкий, и вам нужно пролистать страницу руководства, чтобы найти документацию, но оно того стоит.

apt-show-version также может быть полезен:

apt-show-versions | grep 'No available version'
тушеное мясо
источник
1
см. хорошую статью об устаревших пакетах здесь: raphaelhertzog.com/2011/02/07/…
Lluís
Еще один полезный список сгенерированapt-show-versions | grep "newer than version in archive"
Шон
Я думаю, что apt-show-version лучше всего, потому что линия aptitude чрезвычайно запутанна для запоминания. Каждый раз, когда мне это нужно, мне приходится гуглить, искать, сохранять, создавать сценарии и т. Д.
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.

japzone
источник
Работает для всех моих локально dpkgустановленных пакетов. Одно исключение Это перечисляет skype-bin, тогда как apt-cache policy skype-binясно показывает каноническое партнерское репо. Я не уверен, что происходит. Многоархатный вопрос? Еще +1 за apt-show-versions!
gertvdijk
aptitude называет эти «устаревшие» пакеты. См. Хронический комментарий выше.
Хенк Поули
5

Если у вас установлено приложение aptitude ,

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

Первый символ каждой строки указывает текущее состояние пакета. Наиболее распространенные состояния:

  • р, что означает, что в системе нет следов пакета,
  • с, что означает, что пакет был удален, но его файлы конфигурации остаются в системе,
  • я, что означает, что пакет установлен, и
  • v означает, что пакет является виртуальным.

Второй символ указывает сохраненное действие, которое должно быть выполнено на пакете, если таковые имеются, в противном случае отображается пустое пространство. Наиболее распространенные действия:

  • я, что означает, что пакет будет установлен,
  • d означает, что пакет будет удален, и
  • p означает, что пакет и его файлы конфигурации будут удалены.

Если третий символ A, пакет был автоматически установлен.

Полный список возможных состояний и флагов действий см. В разделе « Доступ к информации о пакете» в справочном руководстве aptitude.

Демис Пальма ツ
источник
1
aptitude search ?obsoleteможет работать в bash, но вы должны использоватьaptitude search '?obsolete'
AB
Не могли бы вы добавить некоторые детали при разборе вывода?
Старейшина Гик
«Устаревший» отличается от «~ o»?
Шон
@ Шон Нет, они не отличаются. ~ o - это краткая форма для «действительно устаревшего».
Демис Пальма ツ
Кавычки разбираются оболочкой. Я думаю, что AB имел в виду, что вы не должны передавать странные символы без экранирования в командной строке, потому что вы не знаете, что ваша оболочка собирается с ними делать.
Шон
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 космический 'показывает ложные срабатывания. Этот ответ намного лучше!
TamusJRoyce
1
@TamusJRoyce, да, я думаю, что теперь после редактирования.
Ярно
1

Больше информации для расследования.

убунт-поддержка-статус 
echo "$ (sudo apt-mark showmanual | wc -l) пакеты помечены как 'установленные вручную'."

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

Ханну
источник
Нет необходимости использовать sudoс apt-mark showmanual.
Ярно
ubuntu-support-statusперечисляет количество устаревших пакетов, но не имена пакетов.
Ярно
1
Прочитайте выводubuntu-support-status --help
Ханну
О, спасибо за подсказку.
Ярно
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для получения списка установленных пакетов, вы должны ограничить результаты строками со знаком «i» во втором столбце, поскольку 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 ' 'также печатает некоторые строки заголовка.
Ярно
Даже если этот ответ сработает, он будет очень медленным, поскольку он будет работать apt-cache searchдля каждого пакета в отдельности.
Ярно
0

Как уже упоминалось, поиск apt-get не является хорошим методом проверки наличия пакета. Дополнительно я добавил все в одну строку:

for i in `dpkg -l | grep '^i' | awk '{ print $2 }'`; do apt-cache show $i > /dev/null || echo $i; done
WoF
источник
И почемуgrep '^i'
AB
@AB хорошая точка зрения; это не говорит, установлен ли пакет, но что должно быть установлено желаемое действие пакета. Смотрите man dpkg-queryдля получения дополнительной информации.
Ярно
Это очень медленно
Ярно
apt-cache showdo не подходит для проверки наличия пакета. Если вы отключите соответствующий репозиторий, и ни у одного другого включенного репозитория его нет, он все равно покажет пакет.
Ярно