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

53

В Gentoo есть файл /var/lib/portage/world, содержащий пакеты, которые я явно установил. Под явным я подразумеваю пакеты, которые я выбираю, не включая ничего, установленного по умолчанию или извлеченного зависимостями.

Есть ли подобный файл или команда, чтобы найти эту информацию в Ubuntu?

phunehehe
источник

Ответы:

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, в то время как другой файл включает.

Оба перечисляют больше пакетов, чем приведенное выше решение.

jmiserez
источник
Если вы обновили свою систему с момента первоначальной установки (что, как мне кажется, относится к большинству людей), лучше использовать файл манифеста текущей версии 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
mmaruska
источник
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уловка с ними не сработает.
tshepang
источник
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 не мой, и я не могу вспомнить, где я ее видел.

Archit
источник
3

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

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

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

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

Ниже дополнение к ответу Стивена двойки .

Следующая строка, похоже, усекает имена пакетов до 32 символов:

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

Это похоже на работу:

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

увидеть этот ответ

Уэс Тернер
источник
1

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

Joril
источник
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
Papou
источник