Як знайти встановлені вручну пакети?


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
Так, хоча це корисно, воно не робить те, що задається питанням.
Timmmm

3
Якщо ви це зробите, автоматично встановлені залежності ніколи не будуть очищатись при видаленні програм. Чому люди підголошують відповідь, яка робить те, що запитувач спеціально сказав, що не хоче?
jbo5112

20

Ця тема від superuser.com дає таке рішення:

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

2
Це не працює для мене. Просто перелічується все, що встановлено, або, звичайно, більше, ніж я прямо просив.
Timmmm

У ньому перераховано все, що ви встановили 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

6

Ви можете використовувати 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:

Коли ви відповісте "у" на кожне запитання (просто натисніть клавішу 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 застаріло на користь придатності, я віддаю перевагу швидкої та простої конфігурації debfoster. Це ставить вас в середину вашої бази пакетів пакетів і дозволяє прибирати речі, роблячи автоматичні та ручні пакунки більш очевидними.

Введіть "h" у рядок debfoster, щоб пояснити свої варіанти. Введіть "?" щоб побачити опис упаковки. Як до тут може бути корисним.


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.


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)хоча.
Timmmm

Ви можете використовувати zgrepзамість цього gunzipабо на zcatтрубопроводі grep. Це віртуальний скрипт, який постачається з gzip, я вірю. Він також приймає нестиснені файли, тож ви можете спростити свій сценарій доzgrep -E '(\[INSTALLIEREN\]|\[INSTALL\])' /var/log/aptitude* | awk '{ print $2 }'
Стів Бузонас

2

Я можу витягнути все, відкривши файли журналів у / var / log / apt /

Потім я заходжу і вручну фільтрую пакети apt-get install. Можливо, існує спосіб це зробити систематично, але я цього не знаю.


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

таким чином ви бачите список команд, виконаних у минулому.

Видаліть grep-код, якщо вам потрібна додаткова інформація:

less history.log

якщо журнал стиснений (тобто закінчується гц)

gunzip <filename>

щоб знову застебнути його після завершення, ви можете зробити:

gzip <filename>

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

Я не бачив тут жодних рішень для мене, я встановив досить багато пакетів дебюту з 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, який має хороше рішення, але він не веде себе правильно як вихід з придатності змінилося. Ось оновлена ​​версія, що базується на порівнянні поточно встановлених пакетів порівняно з 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

Ви також можете зайти на інший сайт та оновити відповідь там.
Мартін Удінг

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

0

Я не знайшов підходящого для мене, тому написав сценарій. Аналізуючи вміст /var/log/apt/history.log* та / var / log / aptitude, потім сортуйте за датою часу, у результаті чого є два списки, один встановлюється pkgs вручну, інший встановлюється, але видаляється pkgs. Сценарій із підтвердженням "правильного списку". невелике відхилення, оскільки використання dpkg встановленого та модифікованого джерела PPA.

Я ставлю сюди, https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl .

якщо комусь потрібно тестувати його, можливо, потрібно змінити якийсь код, оскільки мої файли журналів змішані китайською та англійською мовами (особливо формат дати RFC2822), мені потрібно з цим розібратися. введіть тут опис зображення


Що це за нечитабельний скріншот настінного тексту?
muru

Це мій вихід сценарію. Але сьогодні я вважаю, що dnf від Fedora є більш ефективним. "dnf history" показує чисту історію роботи пакетів.
utopic eexpress

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

Для цього знадобиться трохи модифікувати (наприклад, з sed), якщо ви хочете лише назви пакетів в окремих рядках; вправа для читача!

Варто зазначити, що у менеджера синаптичних пакетів ( gksu synapticабо kdesudo synaptic) у розділі «статус» є список «встановлено (вручну)». Якщо ви позначаєте весь список для видалення [не застосовуйте його !!], ви зможете зберегти помічені зміни та отримати таким чином список пакетів. Увага: це заблоковано synapticдля мене (імовірно, розрахунок усунення залежностей).


Скопійовано з моєї відповіді в іншому місці.
pbhj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.