Как найти установленные вручную пакеты?

Я установил простой Ubuntu 10.10 на свой компьютер и установил некоторое программное обеспечение через apt-get. На прошлой неделе мне удалось сломать все и просто начать с нуля, и мне нужно переустановить мое программное обеспечение. Есть ли способ создать список со всеми пакетами, которые я установил вручную?

Чтобы он дал мне список, подобный texlive, ..., а не texlive, texlive-dep1, textlive-dep2, ..., и все стандартные пакеты удалены? [ ! d1]

Если бы я мог каким-то образом выяснить, какие программы из обычной установки я удалил, это тоже было бы потрясающе!

Update 2015-05-23: Теперь я использую Ansible для управления конфигурацией в своих системах. Там я указываю пакеты для установки. Это служит цели, еще более улучшая установку всех программ на новую систему. Таким образом, этот вопрос может быть входом в управление легкой конфигурацией.

1
задан 23 May 2015 в 16:09

14 ответов

С этим предложением я предполагаю, что ваша старая установка будет по-прежнему загружаться!

Повторить один набор пакетов на другом компьютере:

В системе A запустите:

dpkg --get-selections | grep -v deinstall > my-selections

Переместите файл my-selections в систему B.

В системе B запустите:

dpkg --set-selections < my-selections

, а затем:

[ f3]

Важное примечание. Если вы установили пакеты из нестандартных репозиториев и / или PPA, вы также захотите скопировать /etc/apt/sources.list и содержимое /etc/apt/sources.list.d/ из системы A в систему B, прежде чем запускать обновление .

Вы также можете использовать dpkg, чтобы увидеть, что вы также удалили (NB: это также включает в себя пакеты, которые вы вручную установили и удалили):

dpkg --get-selections | grep deinstall

Вы может видеть ваши результаты в терминале или, конечно же, перенаправлять файл.

25
ответ дан 25 May 2018 в 22:24
  • 1
    Я хотел бы получить список всех пакетов, но я хотел бы иметь только имена пакетов, которые я явно установил. Так что просто something, а не something-common. – Martin Ueding 5 April 2011 в 19:15
  • 2
    Да, в то время как это полезно, это не делает то, что задает вопрос. – Timmmm 22 December 2012 в 02:54
  • 3
    Если вы это сделаете, тогда автоматически устанавливаемые зависимости никогда не будут очищены при удалении программ. Почему люди голосуют за ответ, который делает то, о чем заявитель сказал, что он не хочет? – jbo5112 24 May 2015 в 02:23

Этот поток от superuser.com дает это решение:

aptitude search '?installed ?not(?automatic)'
19
ответ дан 25 May 2018 в 22:24
  • 1
    Это не работает для меня. Просто перечисляет все, что установлено, или, конечно, больше, чем я просил. – Timmmm 22 December 2012 в 02:54
  • 2
    В нем перечислены все, что вы установили с помощью apt-get, а также их зависимости. Так, например, если вы установили aptitude, тогда он также перечислит apt-xapian-index aptitude-common libboost-iostreams1.54.0 libclass-accessor-perl libcwidget3 libept1.4.12 libio-string-perl libparse-debianchangelog-perl libsigc++-2.0-0c2a libsub-name-perl libtimedate-perl libxapian22 python-chardet python-debian python-six python-xapian – Runemoro 7 June 2014 в 19:43

Если ваши apt-журналы находятся в / var / log / apt, что-то вроде этого должно работать:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install"

Или если вы хотите избавиться от некоторого повторяющегося мусора в выходе: [ ! d1]

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq
10
ответ дан 25 May 2018 в 22:24

Вы можете использовать метку apt, но я рекомендую debfoster:

sudo apt-get install debfoster
sudo debfoster

Это проверит все установленные пакеты и определит, какие из них поддерживают остальные:

texlive-full is keeping the following 161 packages installed:
  cm-super cm-super-minimal context doc-base dvipng feynmf
  fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
  ...
Keep texlive-full? [Ynpsiuqx?], [H]elp:

Когда вы отвечаете «y» на каждый вопрос (просто нажмите Enter, чтобы быстро перейти), debfoster будет собирать список пакетов и записывать их по очереди в файл. По умолчанию это /var/lib/debfoster/keepers. Это выглядит так:

gnome-do
texlive-full
...

Я настраиваю debfoster через /etc/debfoster.conf, чтобы поместить этот список в /etc/debfoster-keepers и отслеживать файл с помощью apt-mark , чтобы сохранить историю и резервные копии , Ответ здесь показывает, как установить список пакетов из текстового файла с разделителями новой строки:

sudo apt-mark manual $(cat debfoster-keepers)

Обратите внимание на ограничение здесь, у пакетов, которые вы очистили, перед ними есть «-». Таким образом, вы хотите удалить эти строки перед вызовом apt-mark.

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

Введите «h» в приглашении debfoster, чтобы объяснить ваши варианты. Тип "?" чтобы увидеть описание пакета. Практическое руководство здесь может быть полезно.

6
ответ дан 25 May 2018 в 22:24
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Дает все установленные вручную пакеты (а не системные пакеты, а не зависимости). Для примеров это показывает build-essential, но не gcc.

5
ответ дан 25 May 2018 в 22:24

Я могу вытащить все, открыв файлы журнала в / var / log / apt /

Затем я вхожу и вручную отфильтровываю пакеты установки apt-get. Возможно, есть способ сделать это программно, но я не знаю об этом.

2
ответ дан 25 May 2018 в 22:24
cd /var/log/apt
cat  history.log | grep Commandline

таким образом вы видите список команд, выполненных в прошлом.

Удалите grep-код, если вам нужна дополнительная информация:

less history.log

, если журнал сжимается (т.е. заканчивается на gz)

gunzip <filename>

, чтобы сделать zip это снова, когда вы закончите, вы можете сделать:

gzip <filename>
1
ответ дан 25 May 2018 в 22:24
  • 1
    Вместо разжатия и повторного сжатия файлов журнала, почему бы не использовать zcat? Это так же просто, как zcat filename.gz. Его можно просто использовать в сжатых файлах gzip вместо cat. Также grep можно заменить на zgrep, например. [F6]. – lgarzo 2 July 2013 в 21:18
  • 2
    Основываясь на вашей идее, я придумал командную строку: (grep "Commandline" history.log ; zgrep "Commandline" history.log.*.gz ) | grep " install " | grep -v -- "--yes" | sed -r "s/^.*install //". У этого есть недостатки, потому что удаленные пакеты также перечислены, и если пакет был установлен более одного раза, он указан многократно. – lgarzo 2 July 2013 в 21:31

Я не видел, чтобы какие-либо решения здесь работали для меня, я установил довольно много deb-пакетов с dpkg, и некоторые из элементов, которые я особенно искал, отсутствовали.

Довольно длинный лайнер, но удобно скопировать и вставить:

export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > $DPKG_INITIAL ; awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > $DPKG_INSTALLED ; comm -23 installed initial > $DPKG_CUSTOM ; function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; } ; echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > $DPKG_DEPS ; comm -23 custom deps > my-packages ; rm $DPKG_INITIAL $DPKG_INSTALLED $DPKG_CUSTOM $DPKG_DEPS

Вышеприведенная команда сохраняет список пакетов в файл в текущем рабочем каталоге с именем my-packages.

Пояснение

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

zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial

Далее следует длинный список элементов, установленных вообще.

[ f3]

Затем я сравнил два файла initial и installed, чтобы перечислять только уникальные объекты, которые были установлены.

comm -23 installed initial > custom

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

Я написал быструю функцию bash, чтобы сократить эти шаги при обработке этих элементов.

function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }
[d9 ] После этого я передал каждую строку из своего файла custom в эту функцию с помощью xargs.

echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps

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

comm -23 custom deps > manual

И мой законченный список пакетов теперь доступен в файле с именем manual, доступным для просмотра.

1
ответ дан 25 May 2018 в 22:24

Для тех, кто предпочитает использовать apt- * tools, есть утилита apt-mark, которая позволяет как запрашивать, так и изменять ручное / автоматическое состояние.

apt-mark showmanual

Вы также можете указать шаблон для пакетов, которые вам интересны :

apt-mark showmanual qemu\*
1
ответ дан 25 May 2018 в 22:24

Кто-то связан с https://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/3624#3624, который имеет хорошее решение, но он не ведет себя корректно, поскольку выход из aptitude изменился. Ниже приведена обновленная версия, основанная на сравнении уже установленных пакетов по сравнению с 12.04 LTS. Вам понадобится aptitude, это единственное требование.

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled && wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled && comm -23 currentlyinstalled defaultinstalled

Чтобы разбить приведенную выше команду на части, этот бит выводит один пакет на строку всего, установленного в системе

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled

И это загружает список пакетов по умолчанию & amp; обрезает избыточную информацию.

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled

и comm сравнивает два файла и выводит пакеты, которые arent в списке по умолчанию.

comm -23 currentlyinstalled defaultinstalled
0
ответ дан 25 May 2018 в 22:24
  • 1
    Вы также можете перейти на другой сайт и обновить ответ. – Martin Ueding 16 October 2013 в 12:19

Используйте файл манифеста распространения в качестве базового пакета. Сортировка результатов, установленных вручную, в группы пакетов по архитектуре и разделу, поэтому проще сосредоточиться на группах пакетов (возможно, вам не нужны некоторые разделы).

https://gist.github.com / darrenleeweber / 8cc570ff402f19af7fa4

#!/bin/bash

manifest_url='http://releases.ubuntu.com/releases/trusty/ubuntu-14.04.3-desktop-amd64.manifest'
manifest_file=$(echo $manifest_url | sed -e 's#.*/##g')
if [ ! -e $manifest_file ]; then
    wget -q $manifest_url
fi
cat $manifest_file | cut -f1 | sort -u > default_installed.txt

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currently_installed.txt

comm -23 currently_installed.txt default_installed.txt > manually_installed.txt

# sort the 'mannually_installed.txt' packages by architecture and section
mkdir -p package_files
while read p; do
    apt-cache show $p > info.txt
    arch=$(grep -m1 'Architecture: ' info.txt | sed -e 's/Architecture: //')
    section=$(grep -m1 'Section: ' info.txt | sed -e 's/Section: //' -e 's/\//_/g')
    file="${arch}_${section}_packages.txt"
    echo $p >> "package_files/$file"
done <manually_installed.txt

rm info.txt
0
ответ дан 25 May 2018 в 22:24
  • 1
    Было бы легко изменить файлы пакета, чтобы каждая строка имела префикс apt-get install -y , а файл - скрипт bash. Затем все файлы пакетов могут быть включены в цикл предоставления брандмауэра. – Darren Weber 29 September 2015 в 08:50
[F1]
0
ответ дан 25 May 2018 в 22:24

Я не нашел подходящего для меня, поэтому написал сценарий. Анализируя содержимое /var/log/apt/history.log* и / var / log / aptitude, затем сортируйте по дате, в результате получим два списка, один из них установлен вручную pkgs, другой установлен, но удален pkgs. Сценарий с проверкой «apt list». небольшое отклонение, так как использование установленного dpkg и измененного источника PPA.

Я разместил здесь https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl.

, если кто-то нуждается в тестировании, возможно, потребуется изменить код, поскольку мои файлы журналов смешаны на китайском и английском языках (в частности, формат даты и времени RFC2822), мне нужно иметь дело с ним. https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl

0
ответ дан 25 May 2018 в 22:24
  • 1
    Что это за нечитаемый стенографический снимок экрана? – muru 21 March 2017 в 13:56
  • 2
    Это мой сценарий. Но сегодня я нахожу dnf из Fedora более эффективным. "dnf history" показать чистую историю работы с пакетами. – utopic eexpress 22 March 2017 в 13:14

Я думаю, вы хотите использовать /var/log/apt/history.log и его друзей, чтобы внести изменения, которые были сделаны:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt(?:-get)? install (?!.*--reinstall)\K.*'

(Изменено из источника)

Дадут вам все пакеты, которые были установлены в командной строке с использованием изменения apt-get install.

Он получает файлы в zip-файлах в старых history.log s, добавляет их с текущим history.log и проходит через grep, извлечение строк с помощью apt [-get] установка [и / или переустановка] и показ остальной части строки (флаг -o), который соответствует имени (именам) пакета.

Это понадобится немного modding (например, с sed), если вы хотите только имена пакетов в отдельных строках; упражнение для читателя!

Стоит отметить, что диспетчер синаптических пакетов (gksu synaptic или kdesudo synaptic) в разделе «статус» имеет «установленный (вручную)» список. Если вы отметите весь список для удаления [не применяйте его !!], вы должны иметь возможность сохранить отмеченные изменения и получить список пакетов таким образом. Предостережение: это заблокировано synaptic для меня (предположительно вычитание абзацев зависимостей).

0
ответ дан 25 May 2018 в 22:24

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

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