Я хотел бы получить список пакетов, установленных вручную с помощью apt
или aptitude
и быть в состоянии выяснить, является ли foobar
пакет был установлен вручную или автоматически.
Как мы можем сделать это из командной строки?
Я хотел бы получить список пакетов, установленных вручную с помощью apt
или aptitude
и быть в состоянии выяснить, является ли foobar
пакет был установлен вручную или автоматически.
Как мы можем сделать это из командной строки?
Вы можете использовать любой из этих двух однострочников. Оба дают точно такой же результат на моей машине и являются более точными, чем все решения, предложенные до сих пор (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 codec. Кроме того, версии заголовков Linux, похоже, также накапливаются, хотя я установил только метапакет, не зависящий от конкретной версии. Примеры:
libreoffice-help-en-gbopenoffice.org-hyphenationgstreamer0.10-fluendo-mp3linux-headers-3.13.0-29
Как это работает:
sed
удаляет оставшиеся пробелы в конце строки.Другие возможности работают не так хорошо:
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 в качестве ссылок, однако ни одно из них не работает так хорошо, как приведенное выше решение:
Оба перечисляют больше пакетов, чем приведенное выше решение.
РЕДАКТИРОВАТЬ: Что делать, если вы обновились с предыдущей версии:
Если вы обновили Ubuntu с одной версии на следующую, вам, вероятно, потребуется скорректировать этот процесс. В этом случае я бы проверил файл манифеста более новой версии (см. Выше) в дополнение к initial-status.gz файл из текущего выпуска. Вы можете легко сделать это, просто добавив еще одно сравнение. Использование только файла манифеста не будет работать, так как файл манифеста, к сожалению, не содержит всего, что initial_status.gz файл работает (я проверил).
В более новых версиях пакета apt также есть команда apt-mark
apt-mark showmanual
Для 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-plv8Commandline: aptdaemon role='role-install-file' sender=':1.85'Commandline: apt install taskCommandline: apt autoremoveCommandline: apt install atomCommandline: apt upgradeCommandline: apt-get install asciinemaCommandline: apt install iperf3Commandline: apt upgradeCommandline: apt-get install chromium-browserCommandline: 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-devCommandline: aptdaemon role='role-commit-packages' sender=':1.2314'Commandline: apt install gitCommandline: apt install sqliteCommandline: apt install whoisCommandline: apt install libdbd-pg-perlCommandline: apt install perl-docCommandline: apt upgrade
Не уверен, что это сработает aptitude
или нет. Похоже, он не получает установки из настольного приложения Ubuntu Software.
apt-mark showauto | grep -iE '^foobar$'
выведет "foobar", если пакет был установлен автоматически, ничего другого.
aptitude search '!~M ~i'
отобразится список пакетов, которые не были установлены автоматически. Жаль, что aptitude не будет частью установки по умолчанию на Ubuntu Desktop, начиная с 10.10.
Чтобы получить список всех пакетов (не установленных, установленных пользователем или установленных по умолчанию для всех PPA), apt
использует следующий метод:
apt list [option]
Возможными вариантами, полезными для этого, являются:
--installed
для отображения только пакетов, установленных в системе (из более чем 50 000)
--manual-installed
чтобы перечислить пакеты, которые были явно устанавливается командой, либо напрямую, либо в виде зависимостей.
В качестве альтернативы, вы могли бы сделать:
apt list --manual-installed | grep -F \[installed\]
чтобы получить список пакетов, созданных только в результате пользовательских команд и их зависимостей, и получить дополнительную информацию о них, такую как поддерживаемые версии и архитектура (x86, x86_64, amd64, all и т.д.)
Следующий сценарий распечатает все пакеты, которые не настроены на автоматическую установку и, следовательно, были установлены вручную:
#!/usr/bin/pythontry: import apt_pkgexcept 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 распечатывает автоматически установленные пакеты.
Я хотел бы предложить решение с графическим интерфейсом.
Откройте Synaptic Package Manager.
Идти к Статус.
Щелчок Установлен (вручную).
Он выдаст список пакетов, установленных вручную с помощью apt
или aptitude
.
К сожалению, я не смог найти ни одного варианта в Пользовательские фильтры чтобы выяснить, является ли foobar
пакет был установлен вручную или автоматически.
Если посылка находится под Установленный но не под Установлен (вручную), затем он был установлен автоматически. Если посылка находится под Установлен (вручную), затем он был установлен вручную.
Как прокомментировали несколько человек, 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/pythonimport systry: import apt_pkgexcept 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 пунктов, который тоже не кажется точным.
Если никто не даст вам хорошего ответа, используя команду apr-something, вы можете сделать это следующим образом трудный путь. Apt-get хранит свою информацию в /var/lib/apt/extended_states. Любой файл, который будет установлен автоматически, будет добавлен в этот файл. Если вы установите пакет, уже находящийся в этом файле вручную, пакет останется в этом файле, но с автоустановкой: 0 во второй строке. Он не удален.
Примечание: Как и ожидалось, лучшие ответы, которые, вероятно, будут работать, если появились изменения в размещении файлов. Я храню свой на всякий случай, если информация о местоположении файла окажется полезной.
После долгих поисков в Google мне удалось собрать этот скрипт. У меня это хорошо работает:
#!/bin/bash# List of all packages currently installedcurrent=$(dpkg -l | awk '{print $2}' | sort | uniq)# List of all packages that were installed with the systempre=$(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 packagemanual=$(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
возможный дубликат Можно ли определить, какие пакеты я установил, которых нет в ванили install?
Really good solution that excludes packages installed by default: Ubuntu list explicitly installed packages
See this answer on unix.stackexchange.com for a solution that filters out stock packages.
“пакет был установлен вручную или автоматически” Как насчет вручную или с помощью dependency. Я только что выполнил чистую установку Debian для WSL, за которой последовало обновление apt и пользовательская установка только 5 имен пакетов: ack, zsh, vim, tree, git. Три из приведенных ниже решений, набравших наибольшее количество голосов, составляют список из 112 пунктов.