Перелічіть явно встановлені пакети


53

У Gentoo є файл, /var/lib/portage/worldякий містить пакунки, які явно встановив. Явно маю на увазі пакет, який я вибираю, не включаючи нічого встановленого за замовчуванням або витягнутого залежностями.

Чи є подібний файл чи команда для пошуку цієї інформації в Ubuntu?

Відповіді:


46

Просто код

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
  | cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

Пояснення

Один із способів подумати над цією проблемою - це розбити її на три частини:

  • Як отримати список пакетів, не встановлених як залежності?
  • Як отримати список встановлених програм за замовчуванням?
  • Як я можу отримати різницю між цими двома списками?

Як отримати список пакетів, не встановлених як залежності?

Наступна команда, здається, працює в моїй системі:

$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt

Подібні підходи можна знайти у посиланнях, які Жил розмістив як коментар до питання. Деякі джерела стверджують, що це спрацює лише в тому випадку, якщо ви використовували здатність для встановлення пакетів; однак я майже ніколи не використовую здатність для встановлення пакетів і виявив, що це все-таки працює. У --disable-columnsзапобігає APTITUDE від заповнення рядків назв пакунків з пробілами , які будуть перешкоджати порівняння нижче. У | sort -uсортує файл і видаляє дублікати. Це набагато полегшує заключний крок.

Як отримати список встановлених програм за замовчуванням?

Примітка. Цей розділ починається з "неправильного шляху", який, на мою думку, є ілюстративним. Другий фрагмент коду - той, який працює.

Це трохи складніше. Спочатку я думав, що хорошим наближенням стануть усі пакети, що є залежностями метапакетів ubuntu-minimal, ubuntu-standard, ubuntu-desktop та різних пакетів, пов'язаних з ядром Linux. Кілька результатів пошуку Google, схоже, використовували такий підхід. Щоб отримати список цих залежностей, спершу спробував таке (що не спрацювало):

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

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

Однак, схоже, що дзеркала Ubuntu містять файл "маніфесту", який містить усі пакети в установці за замовчуванням. Маніфест для Ubuntu 12.04.3 тут:

http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest

Якщо ви шукаєте цю сторінку (або ближче до дзеркала):

http://mirror.pnl.gov/releases/precision/

Ви повинні мати можливість знайти ".manifest" файл, який відповідає версії та архітектурі, яку ви використовуєте. Для вилучення лише назв пакета я зробив це:

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt

Список, ймовірно, вже відсортований та унікальний, але я хотів переконатися, що він правильно відсортований, щоб зробити наступний крок простішим. Потім я поставив вихід defaultinstalled.txt.

Як я можу отримати різницю між цими двома списками?

Це найпростіша частина, оскільки для більшості Unix-подібних систем є багато інструментів для цього. commІнструмент є одним з багатьох способів зробити це:

comm -23 currentlyinstalled.txt defaultinstalled.txt

Це має надрукувати список рядків, унікальних для першого файлу. Таким чином, він повинен надрукувати список встановлених пакетів, які не встановлені за замовчуванням.


Що робить ваш перший трубопровід цього aptitude search '~i!~M' -F %pне так?
ефемія

@ephemient: Напевно, нічого. Я мало знаю про здатність і тому використовую інструменти, які я знайомий, а не копати у файлі man програми, яку я ніколи не використовую.
Стівен D


3
Це майже працює, але все ще не правильно. Є кілька пакетів і бібліотек, які я, звичайно, не встановлював вручну, що міститься в отриманому списку. Я використовував http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifestі додаткові, | sed "s/ *$//"але все ще без кісток.
jmiserez

1
Перший крок, який отримує список пакетів, не встановлених як залежності, можна замінити apt-mark showmanual | sort -u, як показано в інших відповідях. Простіше і не покладається на те, aptitudeщо не встановлено за замовчуванням.
skagedal

24

Ви можете використовувати будь-який з цих двох одноводкових. Обидва отримують такий же вихід на моїй машині і є більш точними, ніж усі рішення, запропоновані до цього часу (липень 2014 року) у цьому питанні. Вони є комбінацією двох відповідей (1) та (2) . Зверніть увагу , що я спочатку відправив цю відповідь тут .

Використання apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Використання aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Далеко не всі пакети ще падають через тріщину, хоча я підозрюю , що вони є на самому справі встановлено користувачем, або відразу після установки через настройку локалізації мови або , наприклад , з допомогою програми установки Тотема кодека. Крім того, начебто накопичуються версії linux-header, навіть якщо я встановив лише мета-пакет, який не залежить від версії. Приклади:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Як це працює

  1. Отримайте список встановлених вручну пакетів. Для здатності додаткові sedвикреслюють залишки пробілу в кінці рядка.
  2. Отримайте список встановлених пакетів відразу після нової установки.
  3. Порівняйте файли, виведіть лише рядки у файлі 1, які відсутні у файлі 2.

Інші можливості також не працюють:

  • Використання ubuntu-14.04-desktop-amd64.manifestфайлу ( тут для Ubuntu 14.04) замість /var/log/installer/initial-status.gz. Більше пакетів відображається як встановлені вручну, навіть якщо їх немає.
  • Використання apt-mark showautoзамість /var/log/installer/initial-status.gz. apt-markнаприклад, не включає пакет xserver-xorg, тоді як інший файл.

Обидва перераховують більше пакетів, ніж вказане рішення


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

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

Я вражений! Однак я знайшов відсутніх фрагменти. Що з пакунками, які спочатку були встановлені, але потім явно видалені вручну , однак пізніше явно вручну перевстановлені ? Я знайшов це в робочій системі.
n611x007

1
Я поставив питання unix.SE/225330: Список явно видалених пакетів (apt) для вирішення більшої частини завдання.
n611x007

1
Це краще, ніж прийняте рішення, оскільки mirror.pnl.gov/releases/precision/… URL-адреса у прийнятому рішенні зараз 404.
rmunn

9

Відповідно до man apt-mark:

apt-mark showauto
apt-mark showmanual

2
showmanualпоказує такі речі, як xserver-xorg-video-vesa, клянусь, я не встановлював вручну.
phunehehe

ймовірно, встановлений автоматично вашим дистрибутивом при першій установці.
Метт

8

Ось декілька вибіркових результатів cat /var/log/apt/history.log:

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

Що стосується вашого питання, відфільтруйте матеріал за допомогою grep ( cat /var/log/apt/history.log | grep Commandline).

Зауважте, що ці файли обертаються, тому перевірте інші, щоб нічого не пропустити:

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

ПРИМІТКА :

  • Я перевірив як придатність, так і синаптичність (версії 0.70 та 0.6.3 відповідно), і вони обидва записують свою діяльність у цей файл журналу. Єдина помилка з ними полягає в тому, що у них немає лінії, починаючи з цього Commandline, тому grepфокус з ними не працюватиме.

2
Цікаве рішення. Вам потрібно буде трохи відкоригувати команду grep, щоб просто отримати список пакетів та врахувати пакунки, встановлені aptitudeіншими керуючими пакетами. Якщо ваші колоди відвернулися, то тоді вам не пощастило.
Стівен Д

@steven Оновлено Моя греп-фу новачка, тому я залишу це для читача. Крім того, я не знаю, чи річ обертається. Мені залишаються лише файли там.
tshepang

Від того, чи будуть вони обертатися, залежатиме від налаштування вашої логратату та того, як довго працює ваша система. Я не впевнений у замовчуванні Ubuntu, оскільки минуло давно, коли я змінив їх.
Стівен Д

7

Під час пошуку цього запиту я натрапив на цей чудовий oneliner

Один лайнер є

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) \
  )`

Цей oneliner фільтрує пакети, встановлені системою, використовуючи журнали з /var/log/installer/initial-status.gz

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


3

Ви хочете подивитися цю статтю .

В кінці статті є сценарій пітона, який повинен робити те, що ви хочете.

Це було написано для (k) ubuntu . але має працювати і для Ubuntu .


3
посилання більше не працює.
рог

2
Такі розбиті посилання, чому важливо включити у відповідь відповідну інформацію.
whitehat101


1

Перевірити /var/log/apt/term.log


2
це досить болісний спосіб робити речі, і немає різниці між пакетами, які я встановлюю сам, і тими, які витягуються залежностями
phunehehe

Я погоджуюся, але я не знав, що трапно це відслідковує: / Тепер я знаю, завдяки Стефану :)
Жоріл

1

Ви також можете подивитися на файл /var/lib/apt/extended_states.

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

Це корисно, якщо ви хочете знати, що було встановлено на старому розділі.


0

Великі подяки та вітання тим, хто придумав цей самоцвіт сценарію !!!
Я хотів додати свої 2 ¢, і я позначив дату встановлення, яку я виводжу з $ info.
Я не освоїв деталі, чому $ info файли оновлюються чи ні і коли, але це працює на практиці.
Мій скрипт перелічує останні оновлення пакетів, які не залежать від кількості, доданих після установки.
Періодично перевіряючи, я бачив, що я вручну ввійшов би без жодного промаху.
Тобто партії пакетів, встановлених з тієї ж причини. На жаль, оновлення порушують цей порядок.
Після оновлення системи у мене з’явився список моїх доданих пакунків, які оновлення не оновлювалося, а також тих, що були.
Акуратно! Насолоджуйтесь.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(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) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.