Як я можу отримати історію "apt-get install" на Ubuntu?


85

Я збираюся перенести сервер з одного вікна Ubuntu в інший. Я не клоную стару коробку до нової; Я створюю нову систему і переміщую дані за потребою. Я хочу встановити все програмне забезпечення, яке у мене є, на старе вікно на нове.

Чи є простий спосіб знайти історію всіх команд "sudo apt-get install", які я дав з часом? Тобто, dpkg -l показує мені всі встановлені пакети, але не той пакет верхнього рівня, який їх встановив. Якщо є спосіб, щоб dpkg подав мені інсталяційний пакет, я можу знайти там унікальні; в іншому випадку я хочу ще щось сказати "ви встановили ці 24 пакети".



Чи можете ви прийняти відповідь нижче? Щоб бути вдячним людям, які відповіли.
m-ric


Ці рішення перевірять лише те, що сталося ПІСЛЯ останнього обертання журналу. Вони не перевіряють всю історію.
Прем'єр-міністр Краанг

Простий і швидкий спосіб дається у цій відповіді, як askubuntu.com/a/250530/197730 , на це питання Як перелічити всі встановлені пакети .
TooTone

Відповіді:


68

aptІсторія в /var/log/apt/history.logяк сказано в коментарі вище. Однак це не буде перераховувати пакунки, встановлені вручну, використовуючи dpkgтакі графічні інтерфейси, як gdebi. Щоб побачити всі пакунки, які пройшли dpkg, ви можете подивитися /var/log/dpkg.log.


8

5
Процедура в першому посиланні не розрізняє автоматично встановлені пакети та встановлені вручну пакети. /var/log/apt/history.log(у вас неправильне місце розташування BTW) через кілька місяців відвернеться.
Жиль

Жиль має рацію в обох аспектах. У мене є лише близько місяця таких журналів, і я навіть не можу побачити, як встановлюється швидкість видалення журналу (це робиться за допомогою "newsyslog" на FreeBSD). Тож у мене досі немає рішення, але в мене є деякі вказівки. Я можу принаймні простукувати вихідні дані з команди в статті про клонування, шукати імена "високого рівня", встановлювати їх на нове, робити те саме на новому полі, відрізняти два результати та повторювати, поки не задовольняться. Я б все-таки перестала чути більше ідей.
Пол Гофман

7

Ви можете перелічити пакети, встановлення яких було чітко запитано apt-mark.

apt-mark showmanual

Якщо ви користуєтеся стародавним випуском Debian, ось ручний спосіб.

Наступна команда дає список пакетів, встановлення яких було запрошено, вручну чи автоматично. Якщо ви не знаходитесь в середині (де) встановлення пакетів, це список встановлених пакетів.

dpkg --get-selections | sed -n 's/\t\+install$//p'

Наступна команда дає набір автоматично встановлених пакетів:

</var/lib/apt/extended_states awk -v RS= '/\nAuto-Installed: *1/{print$2}'

Збираючи все це разом, наступні команди перелічують встановлені вручну пакети:

comm -23 <(dpkg --get-selections | sed -n 's/\t\+install$//p') \
         <(</var/lib/apt/extended_states \
           awk -v RS= '/\nAuto-Installed: *1/{print$2}' |sort)

1
--- дуже різний результат відcomm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
Cbhihe

У Debian є те, apt-mark showmanualщо еквівалентно вашій останній команді.
maxschlepzig

3
grep -i "Commandline" /var/log/apt/history.log

Показує всі встановлені вами пакети за допомогою: sudo apt-get install xxxxx


Це недостатньо відрізняється від відповіді @ ℝaphink і має бути коментарем до нього.
Карл Ріхтер

2

Замість комбінації tac / head краще використовувати хвіст (для останніх 25 рядків):

tail -n 25 /var/log/apt/history.log

Це недостатньо відрізняється від відповіді @ ℝaphink і має бути коментарем до нього.
Карл Ріхтер

Також це не те саме. хвостик перелічить останні рядки у файлі в тому порядку, у якому вони знаходяться у файлі. tac змінить порядок так, що останній рядок зараз перший, другий останній - другий тощо. Я маю на увазі, "краще" відповідно до кого? Для якої вимоги? Здається, щось надто впевнено.
Тодд Уолтон

0

Інші відповіді допомогли, але дали занадто багато результатів. Для того, щоб скоротити на виході, я почав з , apt-mark showmanualяк і в цій відповіді , а потім відфільтровані пакети встановлено вперше (див ця відповідь про те , як отримати список пакетів , спочатку встановлених, я використовую Ubuntu 18.04.2 , отже , по посиланню нижче) .

BASE_PACKAGES_MANIFEST=http://releases.ubuntu.com/18.04.2/ubuntu-18.04.2-desktop-amd64.manifest
REMOVE_VERSIONS_REGEX='[0-9][.-][0-9][.-][0-9]|[0-9][.-][0-9]|[0-9]'
paste  <( apt-mark showmanual ) <( apt-mark showmanual | sed -r "s/$REMOVE_VERSIONS_REGEX//g" ) |
    grep -vf <( curl $BASE_PACKAGES_MANIFEST | cut -f1 | sed -r "s/$REMOVE_VERSIONS_REGEX|:amd//g" ) |
    cut -f1 |
    sort |
    uniq

Сценарій фільтрує пакети, які були в оригінальному маніфесті, роблячи порівняння незалежно від версії, щоб оновлені пакети не відображалися в списку. Я закінчив список близько 60 пакетів.

Інший спосіб, який мені подобається, - це відповідь, яка шукає всі влучні журнали .


-1

Щоб отримати список останніх встановлених пакетів у порядку зменшення, мені подобається використовувати (наприклад, 25 рядків):

tac /var/log/apt/history.log |head --lines=25

1
Більш ефективним (і алітеративним) було б: tail -25 /var/log/apt/history.log | tac
agc

Це недостатньо відрізняється від відповіді @ ℝaphink і має бути коментарем до нього.
Карл Ріхтер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.