Я установил простой Ubuntu 10.10 на свой компьютер и установил некоторое программное обеспечение через apt-get. На прошлой неделе мне удалось сломать все и просто начать с нуля, и мне нужно переустановить мое программное обеспечение. Есть ли способ создать список со всеми пакетами, которые я установил вручную?
Чтобы он дал мне список, подобный texlive, ..., а не texlive, texlive-dep1, textlive-dep2, ..., и все стандартные пакеты удалены? [ ! d1]
Если бы я мог каким-то образом выяснить, какие программы из обычной установки я удалил, это тоже было бы потрясающе!
Update 2015-05-23: Теперь я использую Ansible для управления конфигурацией в своих системах. Там я указываю пакеты для установки. Это служит цели, еще более улучшая установку всех программ на новую систему. Таким образом, этот вопрос может быть входом в управление легкой конфигурацией.
С этим предложением я предполагаю, что ваша старая установка будет по-прежнему загружаться!
Повторить один набор пакетов на другом компьютере:
В системе 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
Вы может видеть ваши результаты в терминале или, конечно же, перенаправлять файл.
Этот поток от superuser.com дает это решение:
aptitude search '?installed ?not(?automatic)'
Если ваши 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
Вы можете использовать метку 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, чтобы объяснить ваши варианты. Тип "?" чтобы увидеть описание пакета. Практическое руководство здесь может быть полезно.
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.
Я могу вытащить все, открыв файлы журнала в / var / log / apt /
Затем я вхожу и вручную отфильтровываю пакеты установки apt-get. Возможно, есть способ сделать это программно, но я не знаю об этом.
cd /var/log/apt
cat history.log | grep Commandline
таким образом вы видите список команд, выполненных в прошлом.
Удалите grep-код, если вам нужна дополнительная информация:
less history.log
, если журнал сжимается (т.е. заканчивается на gz)
gunzip <filename>
, чтобы сделать zip это снова, когда вы закончите, вы можете сделать:
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
Далее следует длинный список элементов, установленных вообще.
[ 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, доступным для просмотра.
Для тех, кто предпочитает использовать 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
И это загружает список пакетов по умолчанию & 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
Используйте файл манифеста распространения в качестве базового пакета. Сортировка результатов, установленных вручную, в группы пакетов по архитектуре и разделу, поэтому проще сосредоточиться на группах пакетов (возможно, вам не нужны некоторые разделы).
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, затем сортируйте по дате, в результате получим два списка, один из них установлен вручную 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
Я думаю, вы хотите использовать /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 для меня (предположительно вычитание абзацев зависимостей).