От /var/log/apt/history.log
возможно получить список установленных и удаленных пакетов в течение времени x
на основе меток времени, но редактирования файла является довольно раздражающим, таким образом, я ищу (набор) команда (команды) для получения эффективного списка пакетов, которые были установлены после метки времени x_0
(= пакеты, которые были установлены после метки времени x_0
минус пакеты, которые были удалены после метки времени x_0
) в форме списка имен пакета.
software-center
только дисплеи изменяются хронологически и synaptic
не имеет столбца, который представляет время установки. dpkg-query
обещание взглядов, но я ценил бы некоторую справку от кого-то, кто может понять это в минутах, а не дни (последний подает заявку ко мне).
Я запускаю Ubuntu 14.10.
Это кажется этим dpkg
не показывает явно информации о датах установки пакетов.
Так, для единственного выполнения я использовал бы что-то как следующая острота:
cat /var/log/apt/history.log |perl -lne 'next unless /^Start-Date: ([^ ]+)/ && $1 ge "2015-04-26" .. 1; next unless /^(Install|Purge|Remove): (.*)$/; $c = $1; $s = $2; $s =~ s/\([^\)]*\)//g; @packages = map { /^(.*?):/ ? $1 : $_} split /\s*,\s*/, $s; if ($c=~/^Install$/){ $h{$_} = 1 for @packages;} if ($c=~/^(Purge|Remove)$/) {delete $h{$_} for @packages;} END{print for sort keys %h;}'
Дата начала (x_0) была трудно кодирована в команде ("2015-04-26"
).
В течение времени к более подходящему использованию времени был бы автономный сценарий, как это installed_packages.pl
:
#!/usr/bin/perl
# use as follows:
# ./installed_packages.pl '2015-04-26' /var/log/apt/history.log
# or
# ./installed_packages.pl '2015-04-26 16:08:36' /var/log/apt/history.log
use strict;
use warnings;
# the script expects start date as first argument
my $START_DATE = shift @ARGV;
# hash (dict) to accumulate installed & not removed packages
my %installed;
# flag to mark the beginning of "interesting" period of time
my $start = 0;
# loop over lines from the input file
while (my $line = <>){
# remove end-of-line character
chomp $line;
# skip everything until date becomes greater (or equal) than our x_0
$start ||= $line =~ /^Start-Date: ([^ ]+)/ && $1 ge $START_DATE;
next unless $start;
# we're only interested in lines like
# Install: tupi-data:amd64 (0.2+git02-3build1, automatic), tupi:amd64 (0.2+git02-3build1), libquazip0:amd64 (0.6.2-0ubuntu1, automatic)
# or
# Remove: aptitude-common:amd64 (0.6.8.2-1ubuntu4)
# + separate action (install/remove/purge) from package list
next unless $line =~ /^(Install|Purge|Remove): (.*)$/;
my ($action, $packages_str) = ($1, $2);
# remove versions from the list (they're in parentheses)
$packages_str =~ s/\(.*?\)//g;
# split single line into array of package names
my @packages = split /\s*,\s*/, $packages_str;
# remove architecture name (comes after ':')
s/:.*// for @packages;
# if packages have been installed, add them all to the hash (dict) of installed packages
if ($action =~ /^Install$/ ){
$installed{$_} = 1 for @packages;
}
# if packages have been removed, remove them all from the hash (dict) of installed packages
if ($action =~ /^(Purge|Remove)$/) {
delete $installed{$_} for @packages;
}
}
# print all installed and not removed packages, in alphabetical order
for my $p ( sort keys %installed ){
print "$p\n";
}
Использование:
./installed_packages.pl '2015-04-26' /var/log/apt/history.log
или
perl ./installed_packages.pl '2015-04-26' /var/log/apt/history.log
Для частого интерактивного использования я добавил бы проверку аргументов сценария (формат даты начала), реализация -h
переключитесь, чтобы отобразить короткую справку и возможно преобразовать дату начала в именованный переключатель (--start
).
Удачи!
Я взял исходный код этого ответа и немного расширился.
Добавленная стоимость - то, что Вы также получаете очищенные и удаленные пакеты, и вывод может быть фильтрован с grep
.
Перечислите установленные пакеты:
./installed_packages.pl '2015-04-28' /var/log/apt/history.log | grep Installed:
или это для очищенного или удаленного:
./installed_packages.pl '2015-04-28' /var/log/apt/history.log | grep -Ei '(Purged|Removed)'
Исходный код:
#!/usr/bin/perl
# use as follows:
# ./installed_packages.pl '2015-04-26' /var/log/apt/history.log
# or
# ./installed_packages.pl '2015-04-26 16:08:36' /var/log/apt/history.log
use strict;
use warnings;
# the script expects start date as first argument
my $START_DATE = shift @ARGV;
# hash (dict) to accumulate installed & not removed packages
my %installed;
my %removed;
my %purged;
# flag to mark the beginning of "interesting" period of time
my $start = 0;
# loop over lines from the input file
while (my $line = <>){
# remove end-of-line character
chomp $line;
# skip everything until date becomes greater (or equal) than our x_0
$start ||= $line =~ /^Start-Date: ([^ ]+)/ && $1 ge $START_DATE;
next unless $start;
# we're only interested in lines like
# Install: tupi-data:amd64 (0.2+git02-3build1, automatic), tupi:amd64 (0.2+git02-3build1), libquazip0:amd64 (0.6.2-0ubuntu1, automatic)
# or
# Remove: aptitude-common:amd64 (0.6.8.2-1ubuntu4)
# + separate action (install/remove/purge) from package list
next unless $line =~ /^(Install|Purge|Remove): (.*)$/;
my ($action, $packages_str) = ($1, $2);
# remove versions from the list (they're in parentheses)
# $packages_str =~ s/\(.*?\)//g;
# split single line into array of package names
my @packages = split /\s*,\s*/, $packages_str;
# remove architecture name (comes after ':')
s/:.*// for @packages;
# if packages have been installed, add them all to the hash (dict) of installed packages
if ($action =~ /^Install$/ ){
$installed{$_} = 1 for @packages;
}
# if packages have been removed, add them all to the hash (dict) of installed packages
if ($action =~ /^Remove$/) {
$removed{$_} = 1 for @packages;
}
# if packages have been purged, add them all to the hash (dict) of installed packages
if ($action =~ /^Purge$/) {
$purged{$_} = 1 for @packages;
}
}
# print all installed and not removed packages, in alphabetical order
for my $p ( sort keys %installed ){
print "Installed: $p\n";
}
for my $p ( sort keys %removed ){
print "Removed: $p\n";
}
for my $p ( sort keys %removed ){
print "Purged: $p\n";
}