Как я узнаю, какие пакеты были установлены, так как ОС была установлена? Я не хочу знать все установленные пакеты, только те, которые не были частью начальной установки ОС и были явно установлены впоследствии.
Ради этого вопроса, позволяет, принимают новую установку, поскольку я предполагаю, что обновления дистрибутива усложнили бы ситуацию. Я предпочел бы использовать командную строку, но решение GUI будет в порядке, если команда или сценарий не будут доступны.
У меня был беглый взгляд на страницы справочника dpkg
и aptitude
, но не видел ничего очевидного. Кроме того, вывод apt-cache show package-name
или dpkg -s pkg-name
кажется, не дает дат, которые могут быть сравнены с датой установки ОС (который я должен был бы разработать, как добраться также).
Я имею logwatch
на сервере, который отправляет ежедневные уведомления о том, что было установлено. Мое предположение - то, что это анализирует dpkg.log. Я не уверен, что этот метод был бы решением, поскольку многие записи установки, возможно, были logrotated, особенно в более старых системах. И идеально это должно работать на любую систему, рабочий стол или сервер.
Также было бы замечательно, если вывод мог бы включать версию пакета, в настоящее время устанавливаемого, но это может спрашивать слишком много, и я могу всегда написать сценарий его позже, после того как у меня есть имена пакета.
начальная-буква-status.gz и dpkg-запрос метод от https://unix.stackexchange.com/a/80520/9132 дает самый точный и краткий список для моих потребностей.
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) \
)
, Почему мне нравится он, и не другие:
явное сравнение метод от Flint ответ и от https://unix.stackexchange.com/a/3624/9132 включает много зависимостей и другие пакеты, возможно отмеченные, как 'требуется' и установлено автоматически. Например, это перечисляет libvlc5 и vlc-данные , тогда как метод только выше списков vlc.
history.log метод от https://askubuntu.com/a/250530/16741 не перечислит все пакеты, если журналы не возвратятся до установки выпуска. Это также содержит много из обновление команды, которые должны были бы быть отфильтрованы.
dpkg - получать-выборы метод, который является принятым ответ от подобного вопроса, перечисляет все пакеты и зависимости, включая установленных с выпуском. Это не перечисляет только установленных явно.
Весь ISO Ubuntu ([UKLX] buntu/Ubuntu-gnome) идет .manifest
файл, который содержит список всех предварительно установленных пакетов в ISO. Можно найти те файлы манифеста в том же dir загрузки как те ISO на любых зеркалах ISO Ubuntu. Возьмите список доступных релизов Ubuntu как пример; если Вы имеете Trusty
64-разрядный, например, явной ссылкой был бы http://releases.ubuntu.com/trusty/ubuntu-14.04.2-desktop-amd64.manifest.
Таким образом, после того как Вы имеете этот файл, просто сравниваете список пакетов в нем против списка всех установленных пакетов в Вашем использовании Ubuntu comm
команда
$ curl -O http://releases.ubuntu.com/trusty/ubuntu-14.04-desktop-amd64.manifest
$ comm -23 <( dpkg --get-selections | awk '$2 ~ /^(install|hold)/ { print $1 }' | sort ) \
<( awk '{ print $1 }' ubuntu-14.04-desktop-amd64.manifest | sort )
Объяснить что comm
делает, это берет вход из 2 файлов - сначала каждый предоставляет список всех в настоящее время устанавливаемых пакетов и второго файл манифеста. -3
выберите подавляет строки, которые оба файла имеют и -2
подавляет строки, которые только имеет второй файл (файл манифеста, который является). Таким образом в конце Ваш вывод содержит только строки, что только файл, который каждый имеет и это дает Вам пакеты, которые Вы установили вручную, так как ОС была установлена.
Таким образом, там у Вас есть он.
Править
Если также требуется видеть версию пакета рядом с именем пакета в выводе, как Slyvain Pineau указал, канал comm
команда выше к xargs dpkg-query -W -f='${binary:Package} ${Version}\n'
таким образом, это становится
$ comm -23 <( dpkg --get-selections | awk '$2 ~ /^(install|hold)/ { print $1 }' | sort ) \
<( awk '{ print $1 }' ubuntu-14.04-desktop-amd64.manifest | sort ) | \
xargs dpkg-query -W -f='${binary:Package} ${Version}\n
Или альтернативно, с awk
полностью, Это также дает тот же результат как команду выше
awk 'FNR==NR {arr[$1];next} !($1 in arr) { print $0 }' ubuntu-14.04-desktop-amd64.manifest <( dpkg-query -W -f='${binary:Package} ${Version}\n' )
См. эту ссылку для объяснения о том, как awk cmd работают
Большое спасибо и поздравления тем, кто придумал тот драгоценный камень сценария!!!
Я хотел добавить свои 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