Найти все установленные пользователем пакеты


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' из пути 'cache / apt / archives' в путь новой установки и установить их за один раз (без загрузки их снова).


Спасибо за чаевые. Это полезно, хотя я больше искал одну команду, чтобы получить этот список. cat /var/log/dpkg.log | grep 'install', кажется, подходит близко, если я игнорирую элементы, установленные до даты / времени установки
Rabarberski

Добавление причины отрицательного голосования поможет понять проблему в ответе, если таковая имеется. Также приведет к лучшим ответам в будущем.
Ник

Да, даунсвот был случайно моим. Я уже проголосовал за ваш ответ. Когда я попытался пометить ваш ответ как «окончательный», я ошибся и нажал стрелку «вниз». Попытка отменить это вывела на экран сообщение: «Голосуйте слишком старым, чтобы его можно было изменить, если этот ответ не отредактирован». Извини, ник, как за даунвот, так и за путаницу. :-(
Рабарберски

@Rabarberski, хорошо, что происходит ... никакого вреда не сделано.
Ник

не работает, если / var / log / installer не существует, как при установке на сервер. Также было бы целесообразно добавить VERSION NUMBERS, если вы говорите о «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 позаботится об этом, отсортировав их по времени установки и удалив все до установки системы. Отличное использование оболочки!
Хэксни

3

Основываясь на приведенной выше информации, я написал короткий скрипт на Python для просмотра списка пакетов, которые были установлены вручную. Смотрите эту ссылку .

Не стесняйтесь использовать его, хотя я не несу за это никакой ответственности. Тем не менее, отзывы и предложения всегда приветствуются.


Brilliant! Запуск занимает некоторое время, но это единственное найденное мной решение, которое делает именно то, что мне нужно!
Хэксни

2
К сожалению, ссылка теперь не работает (показывает трассировку Python), которая демонстрирует ценность размещения ответа здесь (особенно для «короткого скрипта Python»
Дэвид Льюнг Мэдисон,

Найден репозиторий github со сценарием: github.com/gerjantd/bin/blob/master/… Нажмите «raw» для загрузки и запустите с «python list_manually_installed_packages.py»
Дэвид Льюнг Мэдисон

2
Ссылка на github теперь тоже не работает ...
Suzana

2

Проверьте мой ответ здесь на связанный вопрос: Как я могу отобразить список всех пакетов, установленных в моей системе Debian? , Некоторые из других ответов на этот вопрос также содержат хорошие предложения по получению такого списка.

Этот вопрос должен быть помечен как дубликат, поскольку предыдущий вопрос также охватывает этот вопрос, но может быть полезно, чтобы этот вопрос стоял сам по себе, чтобы его было легче найти.


1

при условии, что у вас есть постоянная история и вы используете aptitude:

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

будет перечислять только те пакеты, которые вы установили с помощью aptitude install ... duh


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

Спасибо geekosaur, хороший код. Я использовал это, но потребовалось некоторое время, чтобы понять, как заставить это работать. Вот как я это сделал в 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.