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

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

247
задан 22 July 2017 в 23:23

15 ответов

Вы можете использовать любой из этих двух однострочников. Оба дают одинаковый результат на моем компьютере и являются более точными, чем все решения, предложенные до сих пор (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. Получить список пакетов, установленных вручную. Для aptitude дополнительный 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 в качестве ссылок, однако ни одно из них не работает так же хорошо, как указанное выше решение:

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

РЕДАКТИРОВАТЬ: Что делать, если вы обновили предыдущий выпуск:

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

254
ответ дан 22 July 2017 в 23:23

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

apt-mark showmanual
75
ответ дан 22 July 2017 в 23:23

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

#!/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 распечатывает автоматически установленные пакеты.

9
ответ дан 22 July 2017 в 23:23

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

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

20
ответ дан 22 July 2017 в 23:23

После многократного гуглинга мне удалось собрать этот скрипт. Он мне подходит:

# 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
2
ответ дан 22 July 2017 в 23:23

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

apt list [option]

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

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

- установлено вручную , чтобы перечислить пакеты, которые были явно ] устанавливается командой, напрямую или как зависимости.

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

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

11
ответ дан 22 July 2017 в 23:23

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

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

2
ответ дан 22 July 2017 в 23:23

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

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

Примечание: Это скорее иллюстрация того, как круто ты будешь выглядеть, раздавая массивные бэш-команды всем своим друзьям.

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
ответ дан 22 July 2017 в 23:23

Для 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 не выполняется.

27
ответ дан 22 July 2017 в 23:23

Как прокомментировали несколько человек, apt-mark showmanual кажется немного ошибочным (и я сообщил об этом как bug 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
ответ дан 22 July 2017 в 23:23

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

enter image description here

  1. Открыть Synaptic Package Manager

  2. Перейти к Статус

  3. Нажмите Установлено (вручную)

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

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

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

4
ответ дан 22 July 2017 в 23:23

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

unopts() {
  in=`cat`
  echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}

list() {
  cat '/var/log/apt/history.log' |
  grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
  egrep --color=never "Commandline: apt-get.* $1" |
  sed -r "s/Commandline: apt-get//;s/ $1//" |
  unopts |
  tr ' ' '\n' |
  sed '/^$/d'
}

hapt() {
  tmp=`mktemp -d`
  installed=$tmp/installed
  deleted=$tmp/deleted
  dpkg=$tmp/dpkg
  list 'install' > $installed
  list '(remove|purge|autoremove)' > $deleted
  dpkg --get-selections |
  grep -v 'deinstall' |
  cut -f 1 > $dpkg
  while read package
  do
    sed -i "0,/$package/{//d;}" $installed
  done < $deleted
  while read package
  do
    if [ -z "`grep --color=never "^$package$" $dpkg`" ]
    then
      sed -i "0,/$package/{//d;}" $installed
    fi
  done < $installed
  cat $installed
  rm -r $tmp
}
-1
ответ дан 22 July 2017 в 23:23

Если вы установили все свои пакеты из терминала с помощью apt, вы можете запустить простое регулярное выражение, ищущее apt install * в содержимом / var / log /apt/history.log и посмотрите, что он пожирает. Регулярное выражение может быть таким простым, как: Командная строка: apt install [\ w -] + (в соответствии с синтаксисом журнала apt в Ubuntu 16.04)

0
ответ дан 5 January 2021 в 23:59

Обновленная версия ответа @jmiserez:

comm -23 \
    <(apt-mark showmanual | sort -u) \
    <(grep -oP '^(?:Package|Depends):\s+\K.*' /var/log/installer/status \
        | grep -oP '[^\s,()]+?(?=(?:\s+\([^)]+\))?+(?:,|$))' \
        | sort -u)

Журнал больше не хранится в /var/log/installer/initial-status.gz , а исходный не исключил зависимые пакеты. Список, который он создаст, будет включать пакеты, которые вы не устанавливали вручную, но он имеет более управляемый размер и по-прежнему очень полезен.

1
ответ дан 5 January 2021 в 23:59

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

$ history | egrep '\bapt\b'

Измените grep для проверки наличия определенных пакетов.

0
ответ дан 5 January 2021 в 23:59

Другие вопросы по тегам:

Похожие вопросы: