Список явно установленных пакетов


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

Подобные подходы можно найти в ссылках, которые Жиль опубликовал в качестве комментария к вопросу. Некоторые источники утверждают, что это будет работать, только если вы использовали aptitude для установки пакетов; однако я почти никогда не использовал aptitude для установки пакетов и обнаружил, что это все еще работает. В --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/precise/

Вы сможете найти файл ".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: Вероятно, ничего. Я мало что знаю об aptitude и, следовательно, об используемых инструментах, с которыми я знаком, а не копаться в файле man программы, которую я никогда не использую.
Стивен Д

1
Вы как бы разрушаете мою надежду, я думал, что есть какой-то стандартный легкий путь :(
phunehehe

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)

Очень немногие пакеты по-прежнему попадают в трещины, хотя я подозреваю, что они на самом деле устанавливаются пользователем, либо сразу после установки через настройку языковой локализации, либо, например, через установщик кодеков Totem. Кроме того, версии заголовков linux также накапливаются, хотя я установил только не зависящий от версии метапакет. Примеры:

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

Если вы обновились, я думаю, вам нужно использовать оба файла, а не только файл манифеста. Вы можете легко сделать это, просто добавив еще одно сравнение. К сожалению, файл манифеста не содержит всего, что делает файл initial_status.gz (я проверял).
jmiserez

Я впечатлен! Однако я нашел недостающую часть. А как насчет пакетов, которые были изначально установлены, но затем явно удалены вручную , однако позже явно переустановлены вручную ? Я нашел это в работающей системе.
n611x007

1
Я задал вопрос unix.SE/225330: перечислите явно удаленные пакеты (apt), чтобы решить большую часть работы.
n611x007

1
Это лучше, чем принятое решение, так как теперь у mirror.pnl.gov/releases/precise/… 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

ПРИМЕЧАНИЕ :

  • Я проверил aptitude и synaptic (версии 0.70 и 0.6.3 соответственно), и они оба записывают свои действия в этот файл журнала. Единственный недостаток, с которым они сталкиваются, заключается в том, что у них нет строки, начинающейся с Commandline, поэтому grepуловка с ними не сработает.

2
Интересное решение. Вам нужно будет немного изменить команду grep, чтобы получить список пакетов и учесть пакеты, установленные aptitudeдругими менеджерами пакетов. Если ваши журналы сместились, значит, вам не повезло.
Стивен Д.

@steven Обновлено. Мой grep-fu новичок, так что я оставлю это читателю. Кроме того, я не знаю, вращается ли вещь. У меня есть только файлы там сам.
Чепанг

От того, будут ли они вращаться, будет зависеть от вашей настройки logrotate и как долго ваша система была вокруг. Я не уверен в настройках 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

Вы хотели бы взглянуть на эту статью .

В конце статьи есть скрипт на python, который должен делать то, что вы хотите.

Это было написано для (k) Ubuntu . но должен работать и для Ubuntu .


3
ссылка больше не работает.
Рог

2
Подобные неработающие ссылки - вот почему важно включать соответствующую информацию в ваш ответ.
whitehat101


1

Проверять, выписываться /var/log/apt/term.log


2
это довольно болезненный способ сделать что-то, и я не делаю различий между пакетами, которые я устанавливаю сам, и
пакетами, привязанными

Я согласен, но я не знал, что apt отслеживает их: / Теперь я знаю, спасибо Стефану :)
Joril

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.