Я установил плоскость Ubuntu 10.10 на моем компьютере и установил некоторое программное обеспечение через Кв. - добираются. На прошлой неделе я сумел повредить все и только что запустился с нуля, и я должен переустановить свое программное обеспечение. Там некоторый путь состоит в том, чтобы создать список со всеми пакетами, которые я установил вручную?
Так, чтобы это дало бы мне список как texlive, ...
и нет texlive, texlive-dep1, textlive-dep2, ...
и все стандартные пакеты удалены?
Если я мог бы так или иначе выяснить, какие программы из регулярной установки я удалил, который был бы потрясающим также!
Обновление 23.05.2015: Я теперь использую Ansible в качестве управления конфигурацией в моих системах. Там я указываю пакеты для установки. Это служит цели, устанавливая все программы в новой системе, еще лучше. Таким образом, этим вопросом могла бы быть запись в некоторое легкое управление конфигурацией.
Исходя из этого, я предполагаю, что ваша старая установка все еще будет загружаться!
Чтобы реплицировать один набор пакетов на другую машину:
В системе A запустите:
[ 110] Переместите файл 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
Вы может увидеть ваши результаты в терминале или, конечно, перенаправить в файл.
Если Ваши способные журналы находятся в/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
Я наконец получил это сейчас:
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"
Вы можете использовать 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. Он помещает вас в середину вашей базы данных пакетов и позволяет вам очистить вещи, делая пакеты auto и manual более очевидными.
Введите «h» в приглашении debfoster, чтобы объяснить ваши варианты. Тип "?" чтобы увидеть описание пакета. с практическими рекомендациями может быть полезным.
Я могу вытащить все, открыв файлы журналов в / var / log / apt /
Затем я захожу и вручную отфильтрую пакеты установки apt-get. Может быть, есть способ сделать это программно, но я не знаю об этом.
Я не нашел подходящего для меня, поэтому написал сценарий. Путем анализа содержимого /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), мне нужно разобраться с этим.
Для тех, кто предпочитает использовать инструменты apt- *, есть утилита apt-mark, которая позволяет запрашивать и изменять ручное / автоматическое состояние.
apt-mark showmanual
Вы также можете указать шаблон для пакетов, которые вас интересуют:
apt-mark showmanual qemu\*
cd /var/log/apt
cat history.log | grep Commandline
Таким образом, вы видите список команд, выполненных в прошлом.
Удалите код grep, если вам нужна дополнительная информация:
less history.log
, если журнал сжат (т. Е. Заканчивается gz)
gunzip <filename>
, чтобы снова сжать его, когда Готово вы можете сделать:
gzip <filename>
Используйте файл манифеста распространения в качестве набора базовых пакетов. Сортируйте результаты, установленные вручную, по группам пакетов по архитектуре и разделам, чтобы было легче сосредоточиться на группах пакетов (возможно, вам не нужны некоторые разделы).
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
Я не видел, что любые решения здесь работали на меня, я установил довольно много 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
Оттуда я хотел отфильтровать зависимости, это - то, где этот метод может пропустить некоторые желаемые пакеты, он не знает о зависимостях, которые также явно установлены.
Я записал быструю функцию удара для сокращения, это ступает в обработку этих объектов.
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
доступный для меня для рассмотрения.
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
.
#! /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
и его друзей, чтобы дать внесенные изменения:
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
(предположительно вычисление удалений зависимостей).
Кто-то связался с 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
сравнивают два файла и выводят пакеты, которых нет в списке по умолчанию.
comm -23 currentlyinstalled defaultinstalled