Как найти установленные пакеты deb, помеченные как вручную

Постановка задачи

apt и aptitude запоминают, какие пакеты были установлены автоматически в качестве зависимостей какого-либо другого пакета или вручную по какой-либо причине. По разным причинам список пакетов вручную может стать ненужным большим и может начать накапливаться с течением времени. Эти пакеты будут удалены только тогда, когда они будут запрошены.

Один из распространенных примеров – это библиотечные пакеты, которые по какой-то причине могут быть установлены как исправление, но позже они могут быть помечены как автоматически установленные после установки определенного программного обеспечения в зависимости от них. Однако, если этого не произойдет, они останутся установленными даже после удаления пакетов в зависимости от них. В некоторых случаях такие инструменты, как deborphan могут найти эти перегруженные пакеты, но им нужно много догадываться, и это не системное решение.

Описание возможного решения

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

Я думаю, что, возможно, я смогу сделать такой инструмент с привязками Python для libapt , но мне бы не хотелось изобретать колесо, если что-то подобное уже существует.

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

 aptitude search -q -F %p '?installed !?automatic (?reverse-depends(?installed .*) | ?reverse-recommends(?installed .*))' 

Я не думаю, что есть способ указать, какая зависимость была найдена для каждого пакета. Если вам нужна эта информация, Python – это путь. Этот очень быстрый и грязный сценарий, похоже, делает это (в основном, я думаю, что это может быть неверно в некоторых непростых случаях, связанных с дизъюнкциями, зависимостями версий, предзависимостью, …).

 #!/usr/bin/env python2 import apt packages = apt.Cache() covered = {} # Inverse dependency computation: for each installed package, record which # packages require it (as Depends: or Recommends:). for p in packages: if p.installed: for l in p.installed.dependencies + p.installed.recommends: for d in l: if packages.has_key(d.name) and packages[d.name].installed: if not covered.has_key(d.name): covered[d.name] = [] covered[d.name] += [p.name] # Print out the manually installed packages that are required by another # installed package, as well as the requiring package(s). for p in sorted(covered.keys()): if not packages[p].is_auto_installed: print(' '.join([p] + covered[p]))