37

Есть ли способ получить список всех установленных пользователем пакетов в системе Ubuntu, то есть пакетов, которые были установлены поверх установленных по умолчанию пакетов?

(Идея состоит в том, чтобы получить полный список, который можно использовать для установки одинаковых пакетов в чистой установке Ubuntu)

8 ответов8

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

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 .

3

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

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

2

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

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

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

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

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

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

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)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .