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

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

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

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


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

16 ответов

Решение

Я наконец получил это сейчас:

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

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

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

sort "$outfile"
rm "$outfile"

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

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

В системе 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/ из системы A в систему B перед запуском обновления.

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

dpkg --get-selections | grep deinstall

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

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

aptitude search '?installed ?not(?automatic)'

Если ваши журналы 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

Вы можете использовать apt-mark, но я рекомендую 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-mark.

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

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

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,

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

apt-mark showmanual

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

apt-mark showmanual qemu\*

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

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

cd /var/log/apt
cat  history.log | grep Commandline

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

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

less history.log

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

gunzip <filename>

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

gzip <filename>

Я не видел, чтобы какие-то решения здесь работали для меня, я установил довольно много пакетов 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

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

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 > installed

Затем я сравнил два файла 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; }

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

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

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

comm -23 custom deps > manual

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

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

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

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

Я положил здесь, https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl.

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

Я думаю, что вы хотите использовать /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.logs добавляет их с текущим history.log и проходит через grep, извлекая строки с помощью apt[-get] install [и / или reinstall] и показывая оставшуюся часть строки (флаг -o), которая соответствует именам пакетов.

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

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

#! /bin/sh
DEFAULT=`tempfile`
CURRENT=`tempfile`
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print $2}' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print $1}' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT

Кто-то связался с https://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/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

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

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

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

comm -23 currentlyinstalled defaultinstalled

Я не уверен, что это сработает в конкретном случае, описанном в вопросе, но в целом для просмотра установленных вручную пакетов apt вы можете просто запустить

apt-mark showmanual

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