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

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

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

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


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

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

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

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

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

Переместите файл my-selections в System 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 

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

Эта тема от 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 ... 

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

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

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

Несмотря на то, что на веб-сайте 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 .

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

 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" 

Я могу извлечь все, открыв файлы журнала в / 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; } 

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

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

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

 comm -23 custom deps > manual 

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

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

 apt-mark showmanual 

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

 apt-mark showmanual qemu\* 

Кто-то связан с 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 

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

 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 

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

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 
 #! /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 

Я не нашел подходящего для меня, поэтому написал сценарий. Анализируя содержимое /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), мне нужно иметь дело с ним. введите описание изображения здесь