Как получить список недавно установленных пакетов после времени x без удаленных пакетов после времени x?

От /var/log/apt/history.log возможно получить список установленных и удаленных пакетов в течение времени x на основе меток времени, но редактирования файла является довольно раздражающим, таким образом, я ищу (набор) команда (команды) для получения эффективного списка пакетов, которые были установлены после метки времени x_0(= пакеты, которые были установлены после метки времени x_0 минус пакеты, которые были удалены после метки времени x_0) в форме списка имен пакета.

software-center только дисплеи изменяются хронологически и synaptic не имеет столбца, который представляет время установки. dpkg-query обещание взглядов, но я ценил бы некоторую справку от кого-то, кто может понять это в минутах, а не дни (последний подает заявку ко мне).

Я запускаю Ubuntu 14.10.

4
задан 30 December 2014 в 13:51

2 ответа

Это кажется этим 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).

Удачи!

2
ответ дан 1 December 2019 в 10:19

Я взял исходный код этого ответа и немного расширился.

Добавленная стоимость - то, что Вы также получаете очищенные и удаленные пакеты, и вывод может быть фильтрован с 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";
}
0
ответ дан 1 December 2019 в 10:19

Другие вопросы по тегам:

Похожие вопросы: