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

47

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

Так что это даст мне список вроде texlive, ... , а не texlive, texlive-dep1, textlive-dep2, ... и все стандартные пакеты удалены?

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

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

    
задан Martin Ueding 25.03.2011 в 17:47
источник

15 ответов

2

Наконец-то я получил его:

outfile="$(mktemp)"
pattern='(\[INSTALLIEREN\]|\[INSTALL\])'

if [[ -f "/var/log/aptitude.1.gz" ]]
then
        gunzip -c /var/log/aptitude.*.gz | grep -E "$pattern" | awk '{ print ; }' > "$outfile"
fi

if [[ -f "/var/log/aptitude" ]]
then
        grep -E "$pattern" "/var/log/aptitude" | awk '{ print ; }' >> "$outfile"
fi

sort "$outfile"
rm "$outfile"
    
ответ дан Martin Ueding 09.08.2011 в 23:18
источник
25

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

Чтобы реплицировать один набор пакетов на другой компьютер:

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

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

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

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

dpkg --set-selections < my-selections

, а затем:

sudo apt-get dselect-upgrade

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

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

dpkg --get-selections | grep deinstall

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

    
ответ дан Mark Russell 25.03.2011 в 18:11
19

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

aptitude search '?installed ?not(?automatic)'
    
ответ дан Jason 02.05.2011 в 19:34
10

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

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

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

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq
    
ответ дан Mzzzzzz 17.10.2013 в 23:21
6

Вы можете использовать apt-mark , но я рекомендую < a href="http://manpages.ubuntu.com/manpages/precise/en/man8/debfoster.8.html"> 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 и отслеживать файл с etckeeper , чтобы сохранить историю и резервные копии. ответ здесь показывает, как установить список пакетов из текстового файла с разделителями новой строки:

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

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

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

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

    
ответ дан rduplain 06.12.2012 в 19:55
5
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 .     

ответ дан ecerulm 22.05.2015 в 17:38
2

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

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

    
ответ дан marty331 25.04.2013 в 18:42
1
cd /var/log/apt
cat  history.log | grep Commandline

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

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

less history.log

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

gunzip <filename>

снова заново закрепить его, когда вы закончите:

gzip <filename>
    
ответ дан Zen 02.07.2013 в 17:32
1

Я не видел, чтобы какие-либо решения здесь работали для меня, я установил довольно много 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  }' > $DPKG_INITIAL ; awk ' !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", ) ; gsub(/:.+/, "", ) ; a[]= } 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  | 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  }' > initial

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

awk ' !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", ) ; gsub(/:.+/, "", ) ; a[]= } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > installed

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

comm -23 installed initial > custom

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

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

function rdep() { apt-cache rdepends  | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }

После этого я передал каждую строку из моего файла custom в эту функцию с xargs .

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

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

comm -23 custom deps > manual

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

    
ответ дан Steve Buzonas 14.04.2015 в 14:52
1

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

apt-mark showmanual

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

apt-mark showmanual qemu\*
    
ответ дан Alexander Koptelov 30.01.2017 в 17:21
0

Кто-то связан с ссылкой , который имеет хороший решение, но оно не ведет себя корректно, поскольку результат от 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
    
ответ дан johndrinkwater 13.10.2013 в 19:56
0

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

Ссылка

#!/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
    
ответ дан Darren Weber 29.09.2015 в 07:38
0
#! /bin/sh
DEFAULT='tempfile'
CURRENT='tempfile'
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print }' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print }' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT
    
ответ дан Hir0 22.02.2014 в 14:39
0

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

Я разместил здесь Ссылка .

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

ответ дан utopic eexpress 20.03.2017 в 20:40
0

Я думаю, вы хотите использовать /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 .

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

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

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

    
ответ дан pbhj 04.02.2018 в 17:37