Центр программного обеспечения так или иначе показывает довольно короткий список установленных пакетов. Как получить его в текстовом файле?
Я попробовал:
> 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
Это не отвечает на вопрос точно: это скорее дает команду для списка весь 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'
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)
, Хотя у меня нет абсолютно никакой идеи как вышеупомянутые работы ;)
Пакеты, установленные использованием даты cat /var/log/dpkg.log | grep "\ install\ > somefile"
Пакеты, установленные с помощью dpkg
использование ls -l /var/log/dpkg* > somefile
- этот, вероятно, что Вы ищете.
Этот файл содержит вышеупомянутую информацию: /var/log/dpkg.log
Это на самом деле более сложно, чем это кажется, и существует довольно много подобных вопросов на, Спрашивает 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
, но не уверенный, что он использует ту команду явно.
Вот сценарий 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.
Вот небольшое улучшение принятого ответа, в котором перечислены команды с датами их выпуска в хронологическом порядке. Я считаю, что хронологический компонент очень полезен, если вы хотите знать, что вы изменили в своей системе.
Исходный ответ также включал только команды «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