Вопрос Создание списка установленных вручную пакетов и запросов к отдельным пакетам


Я хотел бы получить список пакетов, установленных вручную apt или aptitude и уметь выяснить, foobar пакет был установлен вручную или автоматически. Есть ли какой-либо опрятный способ сделать это из командной строки?


146
2017-08-16 17:07


происхождения


Видеть этот ответ на unix.stackexchange.com для решения, которое отфильтровывает пакеты акций. - Dirk Bergstrom
Возможный дубликат? - askubuntu.com/questions/365 - jrg♦
возможный дубликат Можно ли определить, какие пакеты я установил, которые не находятся в установке для ванили? - Jorge Castro
Действительно хорошее решение, исключающее установленные по умолчанию пакеты: Список Ubuntu явно установленных пакетов - pcworld
Осторожно, комментарии здесь. Люди не говорят, что появляются больше пакетов, но они забывают, что есть установленные пакеты зависимостей из установленного вручную. - Andre Figueiredo


ответы:


Вы можете использовать любой из этих двух однострочных. Оба дают точный результат на моей машине и точнее, чем все предлагаемые до сих пор решения (6 июля 2014 года) в этом вопросе.

С помощью apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

С помощью aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Очень мало пакетов по-прежнему попадают в трещины, хотя я подозреваю, что эти находятся фактически установленный пользователем, либо сразу после установки через установку локализации языка, либо, например, через установщик кодека Totem. Кроме того, похоже, что потоки заголовков linux также накапливаются, хотя я установил метапакет, не относящийся к версии. Примеры:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Как это работает:

  1. Получить список установленных вручную пакетов. Для удобства, дополнительные sed удаляет оставшиеся пробелы в конце строки.
  2. Получите список пакетов, установленных сразу после новой установки.
  3. Сравните файлы, выводите только строки в файле 1, отсутствующие в файле 2.

Другие возможности не работают:

  • Используя ubuntu-14.04-desktop-amd64.manifest файл (Вот для Ubuntu 14.04) вместо /var/log/installer/initial-status.gz, Дополнительные пакеты отображаются как установленные вручную, даже если они отсутствуют.
  • С помощью apt-mark showauto вместо /var/log/installer/initial-status.gz, apt-mark например, не включает пакет xserver-xorg, а другой - файл.

Я использовал другие записи StackExchange в качестве ссылок, однако ни одно из них не работает, как и выше:

Оба перечисляют больше пакетов, чем указанное выше решение.

EDIT: что делать, если вы обновили предыдущую версию:

Если вы обновили Ubuntu с одного выпуска до следующего, вам, вероятно, придется настроить этот процесс. В этом случае я проверил бы файл манифеста новой версии (см. Выше) в дополнение к файлу initial-status.gz из текущей версии. Вы можете легко сделать это, просто добавив другое сравнение. Использование только файла манифеста не будет работать, так как файл манифеста, к сожалению, не содержит всего, что делает файл initial_status.gz (я проверил).


165
2017-07-06 15:01



Это не сработало для меня, потому что /var/log/installer/initial-status.gz пропал, отсутствует. Также я хочу знать, зависит ли это от маркировки apts manual или нет? - Anwar
Увы, для версий сервера нет манифеста. - Antti Haapala
Я побежал showmanual (ниже). И использовать comm для сравнения двух (отсортированных) списков. showmanual результат дал мне 1,840 Больше уникальные пакеты от apt-mark showmanual не показан этим методом. НЕТ-пакеты были уникальны для вывода этого comm-command. Я думаю, что более интересно записать, что для моего ПК, +894 пакеты перечислены в обоих результатах. Не знаете, почему существует такое большое расхождение. Некоторые (многие?) Пакеты кажутся специфичными для выпуска. Другие, такие как XOrg, компоненты GTK и lib* вещи могут быть обновлениями. Так или иначе этот ответ - очень хорошее начало. - will
Я просто сравнил ваши решения с apt-mark showmanual, Интересно, сколько различий видно. ваш список содержит 238 пакетов, тогда как showmanual возвращает 1717 пакетов. Из 2179 установленных пакетов в обоих списках всего 223, 15 - только у вас (примеры: nodejs, lightdm) и 223 - только в showmanual (примеры: xserver-xorg, ubuntu-desktop). Кажется, что ваш список более полезен, но, не зная, откуда эти различия, нелегко решить ... (но я уверен, что я установил nginx и lightdm вручную ...) [извините, что я только что написал тоже самое ;)] - Daniel Alder


В новых версиях пакета apt существует также команда apt-mark

apt-mark showmanual

54
2018-05-17 16:21



Именно этот ответ я искал. - Wolfer
Это показывает больше пакетов, чем я установил вручную. - Umang
@Umang Вы правы. Я бы сказал, что это было не так, когда я написал этот ответ. В моей системе нет причин рассматривать linux-image-3.11.0-*-generic и т. д. - Daniel Alder
@Umang, возможно, это поможет вам askubuntu.com/questions/432743/..., но ответ не принят. Факт в том, что многие пакеты новой установки уже отмечены как руководство. Но все еще есть странные вещи. Остаться с моим примером: linux-image-3.13.0-24-genericявляется ручным, но текущий linux-image-3.13.0-27-generic автоматический. Кажется, что обновление пакета ссылок (в данном случае linux-image-generic, который изменил зависимости), ручная метка автоматически устанавливается - Daniel Alder
@DanielAlder некоторые пакеты новой установки должны быть отмечены как руководство. Если пакеты не помечены как вручную, вся система может быть удалена с помощью apt-get autoremove, Это определенно не то, что вы хотите. - Anton K


apt-mark showauto | grep -iE '^foobar$' будет выводить «foobar», если пакет был установлен автоматически, ничего другого.

aptitude search '!~M ~i' будут перечислены пакеты, которые не были установлены автоматически. Очень жаль, что aptitude не будет частью установки по умолчанию на Ubuntu Desktop, начиная с 10.10.


19
2017-08-16 17:32



aptitude search показывает ВСЕ пакеты не только те, которые установлены вручную (я предполагаю, что это то, чего хотел OP) - Oli♦
@Oli: посмотрите на шаблоны поиска aptitude; шаблон, который я использую, должен делать именно то, что хочет OP. - Li Lo
я побежал Это. Он показывает всю загрузку пакетов, которые не установлены. - Oli♦
Виноват. Исправленный. Спасибо. - Li Lo
Что-то не так с этим, я использую aptitude search '!~M ~i' и в нем перечислены 1043 пакета. Я не могу установить столько пакетов вручную. - ThatGraemeGuy


Для Ubuntu 16.04, проверьте файл журнала /var/log/apt/history.log,

Например:

zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz

Это не идеально, но неплохо дать понять, что я установил вручную. Положите -B 1 на grep, чтобы увидеть, когда он был установлен.

Пример вывода

Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade

Не уверен, что это подхватит aptitude или нет. Кажется, он не забирает установки из настольного приложения Ubuntu Software.


11
2018-02-04 18:48





Следующий скрипт распечатает все пакеты, которые не установлены для автоматической установки, и, следовательно, были установлены вручную:

#!/usr/bin/python

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

он основан на том, как apt-mark печатает автоматически установленные пакеты.


8
2017-08-16 19:42



Престижность вам, сударь. Это фактически работает, в отличие от принятого ответа. - Irfy
показать только пару пакетов для меня --- определенно их не хватает. - Rmano
То же самое, безусловно, отсутствующие вручную установленные пакеты, сразу после того, как я их установил. - David Ljung Madison
С помощью sys.exit(1) без import sys может привести к ошибке в более новых версиях python. Или import sys или использовать exit(1), - Videonauth


Как прокомментировали несколько человек, apt-mark showmanual, похоже, немного глючит (и я сообщил об этом как ошибка 727799). Когда я его использую, он фактически сообщает о множестве вещей, которые даже не вошли в / var / lib / apt / extended_states (где это должно быть сохранено), а apt-get не регистрирует вещи, установленные в / var / lib / apt / extended_states (только в / var / lib / dpkg / status). Сценарий python от txwikinger выше рисует напрямую из / var / lib / apt / extended_states, но если вы используете его сегодня, синтаксис может не работать (мой только что начал генерировать ошибки с Kubuntu 13.10). Обновленный синтаксис:

#!/usr/bin/python
import sys

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

Для меня это был очень короткий список из 5 предметов, которые, похоже, тоже не точны.


5
2017-10-26 23:28



С помощью sys.exit(1) без import sys может привести к ошибке в более новых версиях python. Или import sys или использовать exit(1), - Videonauth


Чтобы получить список всех пакетов (не установленных, установленных пользователем или установленных по умолчанию, во всех PPA), apt использует следующий метод:

apt list [option]

Возможные для этого варианты:

--installed для отображения только пакетов, установленных в системе (из примерно 50 000+)

--manual-installed для перечисления пакетов, которые были эксплицитно установленных командой, либо напрямую, либо как зависимости.

В качестве альтернативы вы можете:

apt list --manual-installed | grep -F \[installed\] получить список пакетов, который был получен только из пользовательских команд и их зависимостей, и получить дополнительную информацию о них, например, о поддерживаемой версии и архитектуре (x86, x86_64, amd64, all и т. д.),


4
2018-02-07 14:01





Как сказал Ли Ло, apt-mark showauto должен получить вам полный список вещей, которые автоматически устанавливаются.

Теперь, чтобы показать вещи, которые установлены вручную, выясняется, что для aptitude существует прекрасный простой модификатор поиска. Но вы не хотите этого делать. Вы хотите написать огромную команду bash, которая делает некоторые ракетные науки.

Заметка: Это скорее иллюстрация того, как круто вы будете выглядеть, выбирая массивные команды bash всем своим друзьям. 

comm -3  <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)

Я разломил его на две строки для удобства чтения. Что это делает?

  • Сначала мы запрашиваем dpkg для списка установленных пакетов.
  • Мы отфильтровываем те, которые установлены на самом деле (а не только остаточная конфигурация)
  • Мы отрубаем статус
  • Мы сравниваем этот список с автоматическим списком из apt-mark
  • Мы раскачиваемся, потому что можем.

1
2017-08-16 17:41



Я сомневаюсь, что это точно, поскольку dpkg часто показывает пакеты, которые не установлены - txwikinger
Я знаю, что вы имеете в виду, но мой баш-фу не достаточно силен. Я знаю, что вы можете показать статус из dpkg-запроса, grep, а затем отрезать статус. Я пойду. - Oli♦
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort) правильно лучше;) - LassePoulsen


Если никто не дает вам приятного ответа, используя команду apr-something, вы можете сделать это трудный путь, Apt-get сохраняет свою информацию в / var / lib / apt / extended_states. Любой файл, который установлен автоматически, будет добавлен в этот файл. Если вы установите пакет уже в этом файле вручную, пакет останется в этом файле, но с автоматической установкой: 0 во второй строке. Он не удаляется.

Примечание. Как и ожидалось, лучшие ответы, которые могут работать, если появились изменения в файлах. Я сохраняю мой на всякий случай, когда информация о местоположении файла полезна.


1
2017-08-16 17:44



Нет. Я быстро просмотрел этот файл, чтобы найти, что liferea была отмечена как автоматическая установка. Я сделал apt-get install liferea и он не установил, но я получил результат, который был чем-то вроде «помечен как установленный вручную». Теперь liferea все еще находится в файле, за исключением того, что следующая строка имеет 0 вместо 1, Кроме того, вы должны изменить свой шаблон регулярного выражения на " foobar$" а не просто foobar, - Umang
Это правда. Моя вина, в моей системе нет линии с 0, но это должно быть редкое событие. Я обновляю ответ на всякий случай. - Javier Rivera


После многопользовательской игры мне удалось собрать этот скрипт. Это работает хорошо для меня:

# List of all packages currently installed
current=$(dpkg -l | awk '{print $2}' | sort | uniq)

# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)

# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)

# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )

for pack in $packages; do
    packname=$(echo $pack | cut -f 1 -d ":")
    desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
    date=$(date -r /var/lib/dpkg/info/$pack.list)

    echo "# $desc"
    echo "# $date"
    echo "sudo apt-get install $pack"
    echo -e ""
done

1
2018-05-31 20:28



Вы можете использовать sort -u вместо sort | unique, В виде apt-markне отображает архитектуру, вы должны отключить ее от вывода dpkg до установленных операций (или использовать dpkg-query -W -f='${Package}\n'). Кроме того, dpkg может отображать некоторые пакеты, которые не установлены в настоящее время. Что касается «desc», вы можете использовать `dpkg-query -W -f = '# $ {binary: Summary} \ n' $ pack, что быстрее. - jarno
Ой, apt-markможет отображать архитектуру для некоторых пакетов, но не для многих dpkg -l, - jarno
apt-cache search медленный. Получение списка установленных дат заранее, используя что-то вроде help.ubuntu.com/community/ListInstalledPackagesByDate может быть более эффективным - opticyclic


Я хотел бы дать графическое решение.

enter image description here

  1. открыто Synaptic Package Manager

  2. Идти к Status

  3. Нажмите Installed (manual)

Он предоставит список пакетов, установленных вручную с помощью apt или aptitude.

К сожалению, я не смог найти какой-либо вариант в Custom Filters чтобы выяснить, foobar пакет был установлен вручную или автоматически.

Если пакет находится под Installed но не Installed (manual) то он был установлен автоматически. Если пакет находится под Installed (manual) затем он был установлен вручную.


0
2018-05-28 15:39