Как получить список установленных пакетов без зависимостей?

Центр программного обеспечения так или иначе показывает довольно короткий список установленных пакетов. Как получить его в текстовом файле?

Я попробовал:

> dpkg --get-selections|wc -l
3265

> aptitude search '~i!~M'|wc -l
1181

> dpkg -l | grep ^ii | sed 's_  _\t_g' | cut -f 2|wc -l
3076

> dpkg --get-selections | grep -v deinstall|wc -l
3076

> apt-mark showmanual|wc -l
1181

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

ОБНОВЛЕНИЕ

Большое спасибо @kos, я получил наконец список с той командой:

> zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt-get install \K.*' | tr ' ' '\n' | grep -v '\-\-reinstall'|grep -v '\-\-force-yes'|grep -v '\-y'|grep -v '\-f'|sort|uniq wc -l
103
8
задан 1 October 2015 в 06:39

5 ответов

Это не отвечает на вопрос точно: это скорее дает команду для списка весь apt-get install команды когда-либо работают наряду с некоторыми советами относительно того, как проанализировать список далее для получения списка весь apt-get install управляйте когда-либо выполненный, исключая выполненных Повсеместностью, так как идеальное решение для этой задачи, кажется, не существует.

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline:(?= apt-get)(?=.* install ) \K.*'
  • zcat /var/log/apt/history.log.*.gz: распаковки все сжатое apt входит в систему /var/log/apt, связывает их и печать к stdout;
  • cat - /var/log/apt/history.log: добавляет /var/log/apt/history.log и печать к stdout;
  • grep -Po '^Commandline:(?= apt-get)(?=.* install ) \K.*': выбирает только строки, запускающиеся с Commandline: apt-get содержа install с продвижением и конечным пробелом и печатью остаток от каждой выбранной строки к stdout;

Это произведет список весь apt-get install команды когда-либо работают (единственный вывод undesidered мог быть apt-get- не -install команда упоминая install пакет, но тот пакет не существует (уже?), по крайней мере, в репозиториях по умолчанию);

Примечание: В моей установке (64-разрядная Ubuntu 15.04), первые четыре перечисленные команды являются выполненными Повсеместностью во время установки; для исключения их можно передать вывод по каналу к sed:

sed '1,4d'

Так, чтобы заключительная приблизительная команда для 64-разрядной Ubuntu 15.04 была бы:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline:(?= apt-get)(?=.* install ) \K.*' | sed '1,4d'
11
ответ дан 23 November 2019 в 05:24
apt-mark showmanual

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

Для записи вывода в файл:

apt-mark showmanual > somefile

существует на самом деле много других путей, таких как использование этой команды

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

, Хотя у меня нет абсолютно никакой идеи как вышеупомянутые работы ;)

пакеты представления To, установленные по дате:

Пакеты, установленные использованием даты cat /var/log/dpkg.log | grep "\ install\ > somefile"
Пакеты, установленные с помощью dpkg использование ls -l /var/log/dpkg* > somefile - этот, вероятно, что Вы ищете.

пакеты представления To установили использование dpkg:

Этот файл содержит вышеупомянутую информацию: /var/log/dpkg.log

6
ответ дан 23 November 2019 в 05:24

Это на самом деле более сложно, чем это кажется, и существует довольно много подобных вопросов на, Спрашивает Ubuntu.

я нашел, что, смотря в /var/log/apt/history.log и более старые gzipped версии того журнала, любая вещь, установленная apt-get install, команда перечислена, как установлено той командой.

Так:

grep "apt-get install" /var/log/apt/history.log

покажет Вам всех их в течение периода, что текущий способный журнал истории касается. Вам будет нужно к gunzip Ваши более старые журналы и grep они для собирания всей информации. Команды grep могли все быть перенаправлены в текстовый файл, чтобы дать Вам хороший список.

Это, вероятно, только полезно для Вашего случая, если Центр программного обеспечения использует apt-get install при установке. Я знаю, что Центр программного обеспечения является фронтэндом для apt, но не уверенный, что он использует ту команду явно.

2
ответ дан 23 November 2019 в 05:24

Вот сценарий Ruby, который использует rdepends, чтобы проверить, является ли пакет зависимостью для другого установленного пакета. Это не скажет точно, что Вы выбрали, но это не зависит от Ваших файлов журналов (который, возможно, был повернут).

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

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

существуют некоторые недостатки с этим подходом:

  • Некоторые пакеты не могли бы быть перечислены как корень , когда они - зависимости некоторого дополнительного, рекомендуемого пакета, Вы выбрали. Например, на моем сервере apache2 перечислен в дочерних пакетах, потому что я также имею libapache2-mod-php, libapache2-mpm-itk и python-letsencrypt-apache установленный, которые имеют apache2 как зависимость.
  • Циклические зависимости (пакеты, который прямо или косвенно зависит от каждого другие) будут перечислены в Дочерних пакетах (например: libapache2-mod-php и libapache2-mod-php7.0). Существует раздел, перечисляющий вероятный цикл (проверьте родословные пакета на 5 поколений), необходимо включать его, чтобы иметь тот же список пакетов (если я не пропустил что-то еще).
#!/usr/bin/env ruby

class ListRootPackages
  def run
    count = manual_marked_packages.count
    @dependencies ||= {}

    @root_packages ||= begin
      manual_marked_packages.each_with_index.map do |package, index|
        STDERR.print "   #{index + 1} / #{count} \r"

        intersection = manual_marked_packages & reverse_dependencies(package)

        if intersection.any?
          @dependencies[package] = intersection
          nil
        else
          package
        end
      end.compact
    end
  end

  def potential_cyclic_dependences
    run

    @potential_cyclic_dependences ||= @dependencies.keys.map do |package|
      package unless has_root_ancestor?(package, 5)
    end.compact
  end

  def has_root_ancestor?(package, level=0)
    return true if @root_packages.include?(package)
    return false if level.zero?

    @dependencies[package].any? { |parent| has_root_ancestor?(parent, level - 1) }
  end

  def root_packages
    run
    @root_packages
  end

  def dependencies
    run
    @dependencies
  end

  def manual_marked_packages
    @manual_marked_packages ||= parse_cli_list(`apt-mark showmanual`)
  end

  private

  def reverse_dependencies(package)
    parse_cli_list(`apt-cache rdepends #{package}`)[2..-1]
  end

  def parse_cli_list(list)
    list.split("\n").map(&:strip)
  end
end

list = ListRootPackages.new
list.run

puts "===== Root Packages (#{list.root_packages.count}) ====="
puts list.root_packages.join("\n")
puts

puts "===== Children packages (#{list.dependencies.count}) ====="
puts list.dependencies.map { |package, parents| "#{package}: #{parents.join(', ')}" }.join("\n")
puts

puts "===== Potential cyclic dependencies (#{list.potential_cyclic_dependences.count}) ====="
puts list.potential_cyclic_dependences.join(", ")

, если бы кто-то хочет преобразовать это в Bash или Python, который был бы хорош, так как Ruby реже установлен на серверах, чем Bash или Python.

0
ответ дан 23 November 2019 в 05:24

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

Исходный ответ также включал только команды «apt-get install», но apt недавно поддерживал прямые команды «apt install», которые не были отражены в ответе. Я сделал PCRE немного более мягким, чтобы включить все команды apt.

zcat /var/log/apt/history.log.*.gz | \
cat - /var/log/apt/history.log | \
grep -Po '^Commandline:(?= apt)(?=.* install ) \K.*|^Start-Date: \K.*' | \
grep -B1 "^apt" | \
grep -v -- "^--" | \
paste -d " "  - - | \
sort
2
ответ дан 12 June 2020 в 16:23

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

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