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

Пожалуйста, задавайте один вопрос в каждом посте, что облегчает ответ. В любом случае:

  1. Это связано с ошибкой 1154980
  2. Это может быть связано с ошибкой 1166709
  3. В настоящее время компоненты Ubuntu SDK не поддерживаются в конструкторе, но их поддержка находится в планах

182
задан 23.07.2017, 09:23

12 ответов

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

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

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

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

205
ответ дан 10.09.2019, 17:28
  • 1
    Это не сработало для меня, потому что /var/log/installer/initial-status.gz отсутствует. Также я хочу знать, зависит ли это от маркировки apts manual или нет? – nbro 29.10.2016, 21:20
  • 2
    Увы, нет манифеста для серверных версий. – Calum 11.04.2017, 02:22
  • 3
    Я выполнил команду showmanual (ниже). И используйте comm для сравнения двух (отсортированных) списков. Результат showmanual дал мне 1840 больше уникальных пакетов из apt-mark showmanual, не показанных этим методом. НЕТ пакетов были уникальными для вывода этой comm -команды. Я думаю, что более интересно записать, что для моего ПК 894 пакетов перечислены в обоих результатах. Не уверен, почему есть такое огромное несоответствие. Некоторые (многие?) Пакеты, похоже, зависят от версии. Другие, такие как XOrg, компоненты GTK и другие вещи, могут быть обновлениями. <Я> Во всяком случае этот ответ очень хорошее начало. – ColinD 25.06.2018, 01:45
  • 4
    Я только что сравнил ваши решения с apt-mark showmanual. Интересно, сколько различий видно. Ваш список содержит 238 пакетов, а showmanual возвращает 1717 пакетов. Из 2179 установленных пакетов только 223 в обоих списках, 15 только в вашем (примеры: nodejs, lightdm) и 223 только в showmanual (примеры: xserver-xorg, ubuntu-desktop). Такое ощущение, что ваш список более полезен, но, не зная, откуда эти различия, нелегко решить ... (но я совершенно уверен, что я вручную установил nginx и lightdm ...) [извините, я только что написал тот же самый ;)] – Sean Patrick Floyd 13.09.2018, 21:45

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

apt-mark showmanual
64
ответ дан 10.09.2019, 17:28
  • 1
    Именно ответ я искал. – ehacinom 31.10.2013, 08:18
  • 2
    Это показывает гораздо больше пакетов, чем я установил вручную. – Blankman 08.07.2014, 01:05
  • 3
    @ Umang Вы правы. Я бы сказал, что это не так, когда я написал этот ответ. В моей системе нет причин рассматривать linux-image-3.11.0-*-generic и т. Д. Как руководство – Blankman 09.07.2014, 01:23
  • 4
    @Umang, возможно, это вам поможет askubuntu.com/questions/432743/… , но ответ не принят. Фактом является то, что многие пакеты новой установки уже помечены как ручные. Но есть еще некоторые странные вещи. Чтобы остаться в моем примере: linux-image-3.13.0-24-generic является ручным, но текущий linux-image-3.13.0-27-generic является автоматическим. Похоже, что при обновлении ссылочного пакета (в данном случае linux-image-generic, который изменил зависимости) ручная отметка устанавливается автоматически – Sean Patrick Floyd 09.07.2014, 01:42
  • 5
    @DanielAlder некоторые пакеты новой установки должны быть помечены как ручные. Если нет пакетов, помеченных как ручные, всю систему можно удалить с помощью apt-get autoremove. Это определенно не то, что вы хотите. – Calum 02.12.2016, 22:57
  • 6
    Если " вручную installed" средства " установленный пользователем после начальной ОС installation" это не корректный ответ. – Stephen C 07.04.2019, 05:37

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

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

выведет «foobar», если пакет был установлен автоматически, иначе ничего.

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

20
ответ дан 10.09.2019, 17:28
  • 1
    aptitude search показывает ВСЕ пакеты, а не только те, которые установлены вручную (я полагаю, это то, что хотел ОП) – overexchange 17.08.2010, 07:42
  • 2
    @Oli: посмотрите на шаблоны поиска способностей; шаблон, который я здесь использую, должен делать именно то, что хочет ОП. – Stephen C 17.08.2010, 07:44
  • 3
    Я <я> побежал это. Он показывает всю загрузку пакетов, которые не установлены. – Jon Skeet 17.08.2010, 07:46
  • 4
    Что-то не так с этим, я использую aptitude search '!~M ~i', и он перечисляет 1043 пакета. Я не могу установить столько пакетов вручную. – Community 16.09.2010, 21:42
  • 5
    Это определенно не работает, как требуется, печатает также предустановленные пакеты. – Andreas 01.11.2012, 15:55

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

21
ответ дан 10.09.2019, 17:28
  • 1
    Из всех ответов за эти годы это единственный, который даже близко подходит к серверу 18.04. – overexchange 07.02.2019, 04: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 печатает автоматически установленные пакеты. [ 112]

9
ответ дан 10.09.2019, 17:28
  • 1
    Слава вам хорошо, сэр. Это на самом деле работает, в отличие от принятого ответа. – TruMan1 01.11.2012, 15:53
  • 2
    покажи мне только пару посылок - определенно скучаю по многим из них. – Blankman 24.01.2014, 06:36
  • 3
    То же самое здесь, определенно отсутствуют установленные вручную пакеты, сразу после их установки. – ColinD 02.03.2016, 13:23
  • 4
    Использование sys.exit(1) без import sys может привести к ошибке в более новых версиях Python. Либо import sys, либо используйте exit(1). – Blankman 27.11.2017, 02:40

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

apt list [option]

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

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

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

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

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

6
ответ дан 10.09.2019, 17:28

Как прокомментировали несколько человек, шоу-мануал apt-mark кажется немного ошибочным (и я сообщил об этом как 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
ответ дан 10.09.2019, 17:28
  • 1
    Использование sys.exit(1) без import sys может привести к ошибке в более новых версиях Python. Либо import sys, либо используйте exit(1). – ColinD 27.11.2017, 02:40

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

enter image description here

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

  2. Перейти к Status

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

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

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

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

4
ответ дан 10.09.2019, 17:28

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

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

2
ответ дан 10.09.2019, 17:28
  • 1
    Это правда. Моя ошибка, в моей системе нет строки с 0, но это должно случаться редко. Я обновляю ответ на всякий случай. – Sean Patrick Floyd 18.08.2010, 06:14

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

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
ответ дан 10.09.2019, 17:28

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

# 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
ответ дан 10.09.2019, 17:28
  • 1
    Вы можете использовать sort -u вместо sort | unique. Поскольку apt-mark не отображает архитектуру, вы должны удалить ее из вывода dpkg перед операциями установки (или использовать dpkg-query -W -f='${Package}\n'). Кроме того, dpkg может перечислить некоторые пакеты, которые не установлены в настоящее время. Что касается & quot; desc & quot ;, вы могли бы использовать `dpkg-query -W -f = '# $ {binary: Summary} \ n' $ pack, что быстрее. – user3562927 21.12.2015, 03:54
  • 2
    О, apt-mark может отображать архитектуру для некоторых пакетов, но не для стольких, как dpkg -l. – bertie 21.12.2015, 11:47
  • 3
    apt-cache search медленно. Предварительное получение списка установленных дат с использованием чего-то вроде help.ubuntu.com/community/ListInstalledPackagesByDate может быть более эффективным – orip 24.08.2017, 16: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 [117 ]
  • Мы качаемся, потому что можем.
1
ответ дан 10.09.2019, 17:28

Теги

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