Знайти всі встановлені користувачем пакети


38

Чи є спосіб отримати список усіх встановлених користувачем пакетів у системі Ubuntu, тобто пакетів, які були встановлені поверх встановлених за замовчуванням пакетів?

(Ідея полягає в тому, щоб отримати вичерпний список, який можна використовувати для встановлення тих же пакетів на чистій установці Ubuntu)

Відповіді:


15

Подивіться на ці файли,

  1. ' /var/log/installer/initial-status.gz' - ваша основна установка
    • ця дата буде вашою датою встановлення (я думаю)
    • ' /var/log/dpkg.log' шкалу оновлення (це те, що ви хочете)
    • ' /var/log/apt/term.log' - речі, aptоновлені у вашій системі
    • ' /var/cache/apt/archives/'буде містити debпакунки, завантажені для встановлення

Оновлення: використовуйте наступні два кроки для точного переліку нових установок:

  1. виконати: grep -w install /var/log/dpkg.log > full-list.log
  2. Подивіться на рядки за межами /var/log/installer/initial-status.gzчасової позначки

Оскільки ви хочете отримати чисту інсталяцію в іншій системі з цими пакетами, ви навіть можете скопіювати файли 'deb' з шляху 'кеш / apt / архіви до нової установки та встановити їх одним знімком (без завантаження їх знову).


Дякую за пораду. Це корисно, хоча я шукав більше для однієї команди, щоб отримати цей список. кішка /var/log/dpkg.log | grep 'встановити', здається, наблизиться, якщо я ігнорую елементи, встановлені до дати / часу інсталяції
Rabarberski

Додавання причини невдалого голосування допоможе зрозуміти проблему у відповіді, якщо така є. Це також призведе до кращих відповідей у ​​майбутньому.
nik

Ой, потік був випадково мій. Я вже підтримав вашу відповідь. Коли я спробував позначити вашу відповідь як "остаточну", я пропустив клацання і натиснув стрілку голосу вниз. Намагаючись скасувати його, з'явилося повідомлення: "Застарілий голос, щоб його можна було змінити, якщо ця відповідь не буде відредагована". Вибачте, nik, і за голос, і за плутанину. :-(
Рабарберські

@Rabarberski, добре, що трапляється ... шкоди не завдано.
nik

не працює, якщо / var / log / installer не існує, як на сервері установки. Також було б доцільно додати ВЕРСІЙНІ НОМЕРИ, якщо ви говорите про "Ubuntu" - який Ubuntu?

8

Тільки для посмішок я зібрав однокласник (тут розділено для ясності), який визначає пакунки, встановлені вручну , виключаючи встановлені спочатку і автоматично встановлені будь-які пакунки:

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

Це працює і в, bashі в zsh.


Це працює майже ідеально, за винятком того, що він видає купу бібліотек, встановлених під час початкової установки. Там купа libtiff, libxcbі т.д. , які я не встановлював сам. Ця відповідь: superuser.com/a/105000/24349 піклується про це, сортуючи відповідно до часу встановлення та видаляючи все до часу встановлення системи. Чудове (аб) використання шкаралупи!
haxney

3

Виходячи з вищенаведеної інформації, я написав короткий скрипт Python, щоб перелічити пакунки, встановлені вручну. Дивіться це посилання .

Не соромтеся ним користуватися, хоча за це я не несу відповідальності. Однак відгуки та пропозиції завжди вітаються.


Блискуче! Пробіг займає певний час, але я знайшов єдине рішення, яке робить саме те, що мені потрібно!
haxney

2
На жаль, посилання зараз розірвано (показує прослідкування пітона), що демонструє значення розміщення відповіді тут (особливо для "короткого сценарію пітона"
Девід Люнг Медісон Зоряний

Знайдено рето для github із сценарієм: github.com/gerjantd/bin/blob/master/… Клацніть на "raw", щоб завантажити, та запустіть із "python list_manually_installed_packages.py"
Девід Люнг Медісон Стеллар

2
Тепер посилання Github теж розірвано ...
Suzana

2

Перевірте моя відповідь тут на пов'язаний з цим питання: Як я можу відобразити список усіх пакетів , встановлених на моїй Debian? . Деякі інші відповіді на запитання також містять приємні пропозиції щодо отримання такого списку.

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


1

припускаючи, що у вас є послідовна історія та користуєтеся здатністю:

history | grep -e "^..... aptitude install"

перелічить лише ті пакунки, які ви встановили з програмою встановлення ...


1

Це хакерська робота, але вона повністю працює.

Спочатку перейдіть на сторінку http://releases.ubuntu.com/maverick/ (або будь-яку версію Ubuntu, яку ви використовуєте) та перейдіть на те, *.manifest fileщо пов'язане з версією Ubuntu, яку ви використовуєте.

Потім запустіть наступний скрипт (заміна <manifest file>, кутові дужки та все, із шляхом до завантаженого файлу. Ви завжди можете додати > outputйого до кінця, щоб зробити файл-дамп.

diff --suppress-common-lines <(sed 's/ .*//' <manifest file>) <(dpkg --get-selections | sed 's/[ \t].*//') | grep '>' | sed 's/[>] //'

1

Дякую геекозавра, приємний код. Я використовував це, але знадобилося певний час, щоб зрозуміти, як змусити його працювати. Ось як я це зробив в Ubuntu 11.10 - він працює в bash-терміналі:

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  ) > user-installed-packages

Потім додайте вкладку— \t—і installв кожному рядку:

sed 's/$/\tinstall/' user-installed-packages >uip

Потім на новій машині:

sudo dpkg --set-selections < uip

І щоб встановити пакети:

sudo apt-get dselect-upgrade

0

Ще один спосіб зробити це - визначити, що було встановлено на основі ваших "завдань", які визначають базові пакети для встановлення відповідно до ваших початкових потреб.

tasksel --list-tasks

По крайней мере, ти мав би server. Однак ви можете вибрати більше. Для кожного із встановлених завдань ви можете отримати список встановлених пакетів, наступна команда робить це все в одному рядку (розбиті на ясність) для тих, які я вибрав у моїй установці:

(tasksel --task-packages server ; \
 tasksel --task-packages openssh-server ; \
 tasksel --task-packages lamp-server) | sort | uniq

Загальним підходом до вищезазначеного буде:

(for a in $( tasksel --list-tasks | grep "^i" | awk '{ print $2 }' ) ; \
 do tasksel --task-packages $a; done) | sort | uniq

Тепер використовуйте apt-cache depends --installed -i --recurse <packagename> | grep -v "^ "для отримання списку залежностей, використовуваних усіма пакетами, визначеними у завданні. Це можна зробити в один рядок наступним чином

apt-cache depends --installed -i --recurse \
     $(for a in $( tasksel --list-tasks | \
                   grep "^i" | \
                   awk '{ print $2 }' ) ; \
       do tasksel --task-packages $a; done) | grep -v "^ " | sort | uniq

Далі наведено перелік усіх пакунків, які встановлені у вашій системі (не включаючи залежності).

dpkg --get-selections | grep "[[:space:]]install" | awk '{print $1}'

Тепер скористайтеся commкомандою, щоб знайти ті, які знаходяться лише у другому списку (тобто ігноруйте ті, які є в обох файлах та лише у першому файлі)

comm -13 <(apt-cache depends --installed -i --recurse \
              $(for a in $( tasksel --list-tasks | \
                            grep "^i" | \
                            awk '{ print $2 }' ) ; \
                do tasksel --task-packages $a; done) | grep -v "^ " | sort ) \
         <( dpkg --get-selections | grep "[[:space:]]install" | \
            awk '{print $1}' | sort)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.