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

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

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

11 ответов

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

apt-mark showmanual
49
ответ дан 29 May 2018 в 12:46
  • 1
    Именно этот ответ я искал. – Wolfer 31 October 2013 в 01:18
  • 2
    Это показывает больше пакетов, чем я установил вручную. – Umang 7 July 2014 в 16:05
  • 3
    @Umang Вы правы. Я бы сказал, что это было не так, когда я написал этот ответ. В моей системе нет причин рассматривать linux-image-3.11.0-*-generic и т. Д. Как руководство – Daniel Alder 8 July 2014 в 16:23
  • 4
    @Umang, возможно, это поможет вам askubuntu.com/questions/432743/… , но ответ не принят. Факт в том, что многие пакеты новой установки уже отмечены как руководство. Но все еще есть странные вещи. Остаться с моим примером: linux-image-3.13.0-24-generic является ручным, но текущий linux-image-3.13.0-27-generic является автоматическим. Кажется, что обновление пакета ссылок (в данном случае linux-image-generic, который изменил зависимости), ручная метка автоматически устанавливается – Daniel Alder 8 July 2014 в 16:42
  • 5
    @DanielAlder некоторые пакеты новой установки должны быть отмечены как руководство. Если пакеты не помечены как вручную, вся система может быть удалена с помощью apt-get autoremove. Это определенно не то, что вы хотите. – Anton K 2 December 2016 в 14:57

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

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

19
ответ дан 29 May 2018 в 12:46
  • 1
    aptitude search отображает ВСЕ пакеты не только те, которые установлены вручную (я предполагаю, что это то, что хотел OP) – Oli♦ 16 August 2010 в 22:42
  • 2
    @Oli: посмотрите на шаблоны поиска aptitude; шаблон, который я использую, должен делать именно то, что хочет OP. – Li Lo 16 August 2010 в 22:44
  • 3
    Я запустил . Он показывает всю загрузку пакетов, которые не установлены. – Oli♦ 16 August 2010 в 22:46
  • 4
    Виноват. Исправленный. Спасибо. – Li Lo 16 August 2010 в 22:50
  • 5
    Что-то не так с этим, я использую aptitude search '!~M ~i', и он перечисляет 1043 пакета. Я не могу установить столько пакетов вручную. – ThatGraemeGuy 16 September 2010 в 12:42

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

#!/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
ответ дан 29 May 2018 в 12:46
  • 1
    Престижность вам, сударь. Это фактически работает, в отличие от принятого ответа. – Irfy 1 November 2012 в 08:53
  • 2
    показать только пару пакетов для меня --- определенно их не хватает. – Rmano 23 January 2014 в 23:36
  • 3
    То же самое, безусловно, отсутствующие вручную установленные пакеты, сразу после того, как я их установил. – David Ljung Madison 2 March 2016 в 05:23
  • 4
    Использование sys.exit(1) без import sys может привести к ошибке в более новых версиях python. Либо import sys, либо используйте exit(1). – Videonauth 26 November 2017 в 18:40

Для 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.

8
ответ дан 29 May 2018 в 12:46

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

4
ответ дан 29 May 2018 в 12:46
  • 1
    Использование sys.exit(1) без import sys может привести к ошибке в более новых версиях python. Либо import sys, либо используйте exit(1). – Videonauth 26 November 2017 в 18:40

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

apt list [option]

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

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

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

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

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

4
ответ дан 29 May 2018 в 12:46

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

# 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
ответ дан 29 May 2018 в 12:46
  • 1
    Вы можете использовать sort -u вместо sort | unique. Поскольку apt-mark не отображает архитектуру, вы должны удалить ее из вывода dpkg перед установленными операциями (или использовать dpkg-query -W -f='${Package}\n'). Кроме того, dpkg может отображать некоторые пакеты, которые не установлены в настоящее время. Что касается «desc», вы можете использовать `dpkg-query -W -f = '# $ {binary: Summary} \ n' $ pack, что быстрее. – jarno 20 December 2015 в 19:54
  • 2
    О, apt-mark может отображать архитектуру для некоторых пакетов, но не для многих dpkg -l. – jarno 21 December 2015 в 03:47
  • 3
    apt-cache search работает медленно. Получение списка установленных дат заранее, используя что-то вроде help.ubuntu.com/community/ListInstalledPackagesByDate , может быть более эффективным – opticyclic 24 August 2017 в 06:37

Как сказал Ли Ло, 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
ответ дан 29 May 2018 в 12:46
  • 1
    Я сомневаюсь, что это точно, поскольку dpkg часто показывает пакеты, которые не установлены – txwikinger 16 August 2010 в 22:47
  • 2
    Я знаю, что вы имеете в виду, но мой баш-фу не достаточно силен. Я знаю, что вы можете показать статус из dpkg-запроса, grep, а затем отрезать статус. Я пойду. – Oli♦ 16 August 2010 в 22:49
  • 3
    comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort) правильно лучше;) – LassePoulsen 16 August 2010 в 22:54

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

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

1
ответ дан 29 May 2018 в 12:46
  • 1
    Нет. Я быстро просмотрел этот файл, чтобы найти, что liferea была отмечена как автоматическая установка. Я сделал apt-get install liferea, и он не установил, но я получил вывод, который был чем-то вроде «помечен как установленный вручную». Теперь lifrea все еще находится в файле, кроме следующей строки имеет 0 вместо 1. Кроме того, вы должны изменить свой шаблон регулярного выражения на " foobar$", а не только на foobar. – Umang 17 August 2010 в 18:21
  • 2
    Это правда. Моя вина, в моей системе нет линии с 0, но это должно быть редкое событие. Я обновляю ответ на всякий случай. – Javier Rivera 17 August 2010 в 21:14

Я хотел бы дать GUI-решение.

Открыть Synaptic Package Manager Перейти к Status Нажмите Installed (manual)

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

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

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

0
ответ дан 29 May 2018 в 12:46

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

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
ответ дан 29 May 2018 в 12:46

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

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