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

48

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

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

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


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

Мартин Уединг
источник

Ответы:

24

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

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

В системе 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

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

Марк Рассел
источник
9
Я хотел бы получить список всех пакетов, но я хотел бы иметь только имена пакетов, которые я явно установил. Так просто somethingи не something-commonтак хорошо.
Мартин Уединг
6
Да, хотя это полезно, оно не делает то, что задает вопрос.
Тимммм
3
Если вы сделаете это, то автоматически установленные зависимости никогда не будут очищаться при удалении программ. Почему люди голосуют за ответ, который делает то, что конкретно спрашивал спрашивающий, он не хотел?
jbo5112
20

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

aptitude search '?installed ?not(?automatic)'
Джейсон
источник
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
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
источник
6

Вы можете использовать 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 via, /etc/debfoster.confчтобы разместить этот список /etc/debfoster-keepersи отслеживать файл с помощью etckeeper, чтобы хранить историю и резервные копии. Ответ здесь показано , как установить список пакетов из новой строки с разделителями текстовый файл:

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

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

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

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

rduplain
источник
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
источник
3

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

apt-mark showmanual

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

apt-mark showmanual qemu\*
Александр Коптелов
источник
Это билет.
Джон фон Нейман
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 $2; }' > "$outfile"
fi

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

sort "$outfile"
rm "$outfile"
Мартин Уединг
источник
2
Я думаю, это работает, только если вы когда-либо устанавливали пакеты, используя aptitude. Есть похожие файлы, /var/log/apt/history.log(.N.gz)хотя.
Тимммм
Вы можете использовать zgrepвместо gunzipили по zcatтрубопроводу grep. Я верю, что это скрипт-обертка, который поставляется с gzip. Он также принимает несжатые файлы, так что вы можете упростить свой сценарий доzgrep -E '(\[INSTALLIEREN\]|\[INSTALL\])' /var/log/aptitude* | awk '{ print $2 }'
Стив Бузонас
2

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

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

marty331
источник
1
cd /var/log/apt
cat  history.log | grep Commandline

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

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

less history.log

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

gunzip <filename>

Застегнуть его снова по окончании можно:

gzip <filename>
Zen
источник
1
Вместо того, чтобы распаковывать и перепаковывать файлы журнала, почему бы не использовать zcat? Это так же просто, как zcat filename.gz. Можно просто использовать его на сжатые файлы GZIP вместо cat. Также grepможно заменить zgrep, например zgrep Commandline history.log.1.gz.
lgarzo
Основываясь на своей идее я придумал с помощью командной строки: (grep "Commandline" history.log ; zgrep "Commandline" history.log.*.gz ) | grep " install " | grep -v -- "--yes" | sed -r "s/^.*install //". У него есть недостатки, поскольку удаленные пакеты также перечислены, а если пакет был установлен более одного раза, он будет указан несколько раз.
lgarzo
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 $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доступным для просмотра.

Стив Бузонас
источник
0

Кто-то связался с 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сравнивает два файла и выводит пакеты, которых нет в списке по умолчанию.

comm -23 currentlyinstalled defaultinstalled
johndrinkwater
источник
Вы также можете перейти на другой сайт и обновить ответ там.
Мартин Уедин
0

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

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
Даррен Вебер
источник
Было бы легко изменить файлы пакета, чтобы каждая строка apt-get install -y имела префикс, а файл представлял собой скрипт bash. Тогда все файлы пакета могут быть включены в цикл предоставления резервных данных.
Даррен Вебер
0
#! /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
Hir0
источник
0

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

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

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

утопический экспресс
источник
Что это за нечитаемый скриншот?
Муру
Это мой сценарий вывода. Но сегодня я считаю, что dnf от Fedora более эффективно. «dnf history» показывает чистую историю работы пакетов.
Утопический экспресс
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добавляет их вместе с текущими history.logи проходит через grep, извлекает строки с помощью apt [-get] install [и / или переустановить] и показывает оставшуюся часть строки (флаг -o), которая равна название пакета (ов).

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

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

pbhj
источник
Скопировано из моего ответа в другом месте.
pbhj