Я думаю, что предвзятость прибывает не из формата пакета, а из несоответствий, которые раньше существовали в репозиториях Redhat.
Назад, когда Redhat был распределением (прежде чем дни RHEL, Fedora и Ядра Fedora), люди будут иногда оказываться в "Аду об/мин" или "Аду зависимости". Это произошло, когда репозиторий закончится с пакетом, который имел зависимости (несколько слоев глубоко, обычно), которые были взаимоисключающими. Или это возникло бы, когда два различных пакета имели две взаимоисключающих зависимости. Это было проблемой с состоянием репозитория, не с форматом пакета. "Ад об/мин" оставил отвращение к системам об/мин среди некоторого населения пользователей Linux, которые стали записанными проблемой.
ОСНОВАННЫЕ НА ОБ/МИН дистрибутивы как Red Hat легки:
rpm -qa --last
На Debian и других находящихся в dpkg дистрибутивах, Ваша определенная проблема легка также:
grep install /var/log/dpkg.log
Если файл журнала не был повернут, в этом случае необходимо попробовать:
grep install /var/log/dpkg.log /var/log/dpkg.log.1
В целом, dpkg
и apt
кажется, не отслеживаю дату установки, идущую отсутствием никакого подобного поля в dpkg-query
страница справочника.
И в конечном счете старый /var/log/dpkg.log.*
файлы будут удалены вращением журнала, так, чтобы путь, как гарантировали, не будет давать Вам всю историю Вашей системы.
Одно предложение, которое появляется несколько раз (например, этот поток) должно посмотреть на /var/lib/dpkg/info
каталог. Файлы там предполагают, что Вы могли бы попробовать что-то как:
ls -t /var/lib/dpkg/info/*.list | sed -e 's/\.list$//' | head -n 50
Для ответа на вопрос о выборах вот, первичная обработка.
список сборки пакетов датами
$ find /var/lib/dpkg/info -name "*.list" -exec stat -c $'%n\t%y' {} \; | \
sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list\t,\t,' | \
sort > ~/dpkglist.dates
список сборки установленных пакетов
$ dpkg --get-selections | sed -ne '/\tinstall$/{s/[[:space:]].*//;p}' | \
sort > ~/dpkglist.selections
присоединитесь к 2 спискам
$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.dates \
> ~/dpkglist.selectiondates
По некоторым причинам это не печатает очень много различий для меня, таким образом, могла бы быть ошибка или недопустимое предположение о какой --get-selections
средства.
Можно, очевидно, ограничить пакеты любой при помощи find . -mtime -<days>
или head -n <lines>
, и измените выходной формат как Вам угодно, например.
$ find /var/lib/dpkg/info -name "*.list" -mtime -4 | \
sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list$,,' | \
sort > ~/dpkglist.recent
$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.recent \
> ~/dpkglist.recentselections
перечислять только выборы, которые были установлены (измененный?) за прошедшие 4 дня.
Вы могли, вероятно, также удалить sort
команды после проверки порядка сортировки, используемого dpkg --get-selections
и сделайте find
более эффективная команда.
Mikel показал, как сделать это на dpkg уровне. В частности, /var/lib/dpkg/info/$packagename.list
создается, когда пакет установлен (и не изменен впоследствии).
При использовании инструментов APT (который Вы, по-видимому, сделали, так как Вы обеспокоены автоматически по сравнению с вручную установленными пакетами), существует история в /var/log/apt/history.log
. Пока это не вращалось далеко, это отслеживает все установки APT, обновления и удаления, с аннотацией для пакетов, отмеченных, как автоматически установлено. Это - довольно недавняя функция, представленная в APT 0.7.26, таким образом, в Debian это появилось в сжатии. В Ubuntu, 10.04 имеет history.log
но автоматически установленная аннотация не присутствует до 10.10.
/var/log/apt/history.log
файл имеет неловкий формат, по моему скромному мнению.
Дата начала: {дата} {время} Командная строка: {команда} {опции...} Установка: {пакет (версия)}..., {пакет (версия)}... Дата окончания: {дата} {время}
Я предпочел бы больше форматированной записи файла журнала
{дата} {время} {вкладка} {пакет} {вкладка} {версия} {вкладка} {команда} {опции }\\n
или некоторый XML, показывающий не только {пакет}, но и любой {зависимости}.
Как в настоящее время реализовано, можно обнаружить информацию, которую Вы ищете, но она требует, чтобы некоторая судебная обработка извлекла детали.
Грубо, но работы:
for fillo in `ls -tr /var/lib/dpkg/info/*.list` ;
do basename ${fillo} | sed 's/.list$//g' ;
done > forens.txt
ls -ltr /var/lib/dpkg/info/*.list > forentime.txt
for lint in `cat forens.txt` ; do
echo -n "[ ${lint} Installed ] : " ;
echo -n "`grep /${lint}.list forentime.txt | awk '{ print $6, $7, $8 }'` : " ;
( ( grep -A3 " ${lint}$" /var/lib/apt/extended_states | \
grep '^Auto' > /dev/null ) && echo "Auto" ) || echo "Manual" ;
done > pkgdatetime.txt
ls
. См. mywiki.wooledge.org/ParsingLs для примечаний по тому, почему это опасно / по сути ошибочный - более безопасная опция состоит в том, чтобы использовать также find -printf
или stat --format
генерировать поток, который может быть однозначно проанализирован.
– Charles Duffy
10.04.2015, 20:17
ls -al --time-style=long-iso
должно быть полезным. Кроме того, это, вероятно, неслыханно, с которым кто-то назвал бы пакет APT \n\t\r\v
на его имя.
– not2qubit
26.04.2018, 14:12
У меня это работает в системе Debian, я предполагаю, что формат файла изменился с 2011 года. Эта система довольно свежая, поэтому я не ожидал, что этот будет работать в более старой системе, хотя это может потребоваться просто разархивировать журналы и использовать глобус для ссылки на все из них.
grep 'install ' /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d' '
Первые два поля в каждой строке файла /var/log/dpkg.log
- это дата и время. Обратите внимание на конечный пробел с install в части grep, потому что обновления могут запускать установку, но если я правильно понял, вы хотели знать, что было установлено пользователями.
Отмечаю это, потому что вы упомянули, что приветствуются ответы других дистрибутивов. rpm имеет большой набор тегов формата вывода, одним из которых является INSTALLTIME. (Используя wget
в качестве примера)
rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1
wget,1454014156
Он может быть отформатирован несколькими способами. Я использую его так:
rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1
wget,Thu 28 Jan 2016 03:49:16 PM EST
Эти две страницы содержат тонну отличной информации о решении проблем с метаданными RPM:
http://www.rpm.org/max-rpm/s1-rpm-query-parts.html
http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html
Сортировка этой информации даст вам рабочее решение для вашей проблемы.
GNU / Linux Debian не имеет встроенных инструментов для решения этой проблемы, но вся информация о программах, установленных стандартным способом , сохраняется в файлах с имя-программы.list в расположение / var / lib / dpkg / info / . Но информации об установленных вручную программах там нет.
Длинное однострочное решение :
for file_list in `ls -rt /var/lib/dpkg/info/*.list`; do \
stat_result=$(stat --format=%y "$file_list"); \
printf "%-50s %s\n" $(basename $file_list .list) "$stat_result"; \
done
Объяснение :
ls -rt
выводит файлы, отсортированные по дате изменения в обратном порядке, т.е. с самыми новыми файлами в конце списка. stat
печатает дату файла в удобочитаемой форме. printf
отображает имя пакета и дату его последней модификации. for
в целом печатает имена пакетов и даты от самого старого до самого нового. Пример вывода (усеченный):
.........................................
gnome-system-log 2016-09-17 16:31:58.000000000 +0300
libyelp0 2016-09-17 16:32:00.000000000 +0300
gnome-system-monitor 2016-09-17 16:32:00.000000000 +0300
yelp-xsl 2016-09-17 16:32:01.000000000 +0300
yelp 2016-09-17 16:32:03.000000000 +0300
gnome-user-guide 2016-09-17 16:32:18.000000000 +0300
libapache2-mod-dnssd 2016-09-17 16:32:19.000000000 +0300
.........................................
linux-compiler-gcc-4.8-x86 2017-02-26 20:11:02.800756429 +0200
linux-headers-3.16.0-4-amd64 2017-02-26 20:11:10.463446327 +0200
linux-headers-3.16.0-4-common 2017-02-26 20:11:17.414555037 +0200
linux-libc-dev:amd64 2017-02-26 20:11:21.126184016 +0200
openssl 2017-02-26 20:11:22.094098618 +0200
unzip 2017-02-26 20:11:23.118013331 +0200
wireless-regdb 2017-02-26 20:11:23.929949143 +0200
nodejs 2017-02-26 20:11:33.321424052 +0200
nasm 2017-02-28 16:41:17.013509727 +0200
librecode0:amd64 2017-03-01 10:38:49.817962640 +0200
libuchardet0 2017-03-01 10:41:10.860098788 +0200
tree 2017-03-04 14:32:12.251787763 +0200
libtar0 2017-03-07 09:51:46.609746789 +0200
libtar-dev 2017-03-07 09:51:47.129753987 +0200
Основной недостаток этого решения - то, что оно плохо протестировано в производственной среде.
Вот тот -лайнер, который всем нужен и нужен:
for x in $(ls -1t /var/log/dpkg.log*); do zcat -f $x |tac |grep -e " install " -e " upgrade "; done |awk -F ":a" '{print $1 " :a" $2}' |column -t
В результате будут показаны все (новые)установленные и обновленные пакеты в хронологическом порядке.
Объяснение строки:
ls -1t
-получить все dpkg.log*
имена файлов в хронологическом порядке zcat -f
-ЕСЛИ файл имеет тип gzip , распаковать его, ИНАЧЕ просто передать содержимое. tac
-Обратный вывод cat , строки -на строку -, чтобы убедиться, что мы получаем правильный хронологический порядок. grep
-Проверяйте только установленные пакеты или обновления . awk -F ':a'
-Отделите поле архитектура от имени пакета column -t
-красиво напечатать столбцы, разделенные пробелом Конечно, хотелось бы создать для этого псевдоним, но, к сожалению, это невозможно, так как awk зависит как от одинарных, так и от двойных кавычек. В этом отношении это лучше всего поместить в сценарий bash, где разделитель :
лучше обрабатывается для других архитектур в столбце поля.
Вывод:
2018-03-06 18:09:47 upgrade libgomp1 :armhf 6.3.0-18+rpi1 6.3.0-18+rpi1+deb9u1
2018-03-05 15:56:23 install mpg123 :armhf <none> 1.23.8-1
2018-03-05 15:56:23 install libout123-0 :armhf <none> 1.23.8-1
2018-01-22 17:09:45 install libmailtools-perl :all <none> 2.18-1
2018-01-22 17:09:44 install libnet-smtp-ssl-perl :all <none> 1.04-1
Недостаток:
Это грубо, но работает так же быстро, как и другие решения. Формат даты — ггггммддччммсс, что означает, что бит или изменение порядка и удаление формата приводит к числу, которое можно сортировать.
Большое спасибо другим решениям, в этом списке перечислены имена пакетов в порядке установки, которые можно использовать в операционной системе, созданной для копирования.
find /var/lib/dpkg/info -name "*.list" -exec stat -c $'%n\t%y' {} \; \
| sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list\t,\t,' \
| sort | awk '{print $2$3" "$1}' | sed '0,/RE/s/-//' \
| sed '0,/RE/s/-//' | sed '0,/RE/s/://' | sed '0,/RE/s/://' \
| sed '0,/RE/s/\\.//' | sed 's/:armhf//' | sort | awk '{print $2}'
Я достиг этого на Kubuntu с помощью следующих команд:
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c '%n|%y' ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done
С уважением,
С ротацией лог-файлов в apt вы можете:
zcat -f /var/log/dpkg.log* | grep " install " | less
apt-get
больше, чемrpm
, но теперь debian добирается-1 для того, чтобы не сохранять дату установки в базе данных. Прием debian включает все установленные пакеты, не только выбранные пакеты, но и это - хорошее начало. – Elazar Leibovich 04.05.2011, 09:53half-installed
записи), если Вы делаете:grep install\ /var/log/dpkg.log
– Pierz 22.11.2016, 18:13grep " install " /var/log/dpkg.log
списки только строки “установки” вместо того, чтобы показать “состояния” также. – dessert 20.12.2017, 21:54