我可以在哪里查看我的更新历史记录?

有没有一个地方可以查看我安装的更新?
7个回答

你可以在/var/log/apt目录下阅读history.log文件。
例如:less /var/log/apt/history.log。

14值得注意的是,在该文件夹中可能存在更早的历史文件,不仅仅是 /var/log/apt/history.log。可能会有类似于 /var/log/apt/history.log.1.gz 的文件。 - Max Bileschi
3即使在Bionic上仍然可以工作。以防有人因为回应的年龄而感到担心。 - Alfabravo
6阅读和筛选旋转日志的方法:zcat /var/log/apt/history.log.* | perl -00 -ne 'print if /\ninstall/i'使用 -00 每个段落是一条记录) - Pablo Bianchi
如果您需要弄清安装过程中发生了什么,终端日志/var/log/opt/term.log也可能会很有帮助。 - Danijel

在10.10版本中,Ubuntu软件中心会列出你过去下载的所有更新。

enter image description here


4+1 这个答案也适用于较新的版本。 - James Bradbury
13@JamesBradbury 在Ubuntu 16.04上,这个选项已经消失了。 - feeela

/var/log/apt 包含了软件包安装的历史记录。然而,默认情况下,它由 logrotate 管理,该工具会压缩并删除旧的记录条目。

1这是我查看Ubuntu Server历史记录的最佳位置吗? - Brettski
1你可以使用zcat/zgrep/zless进行搜索和过滤。 - Pablo Bianchi

作为对lgarzo的回答的另一种选择,你可以从/var/log/dpkg.log中使用grep命令来查找你感兴趣的内容。例如,如果你想要查看昨天安装或升级的所有内容,你可以运行以下命令:
cat /var/log/dpkg.log | grep "^2012-03-25.*\ installed\ "

需要注意的一点是:这也会列出手动安装的软件包(sudo dpkg -i ...),这些软件包在apt的历史记录中不会显示出来。
如果已安装zgrep,那就更好了,因为它可以在压缩文件中查找行。
zgrep "^2012-03-25.*\ installed\ " /var/log/dpkg.log*

在10.04版本中,点击(系统 > 管理 > Synaptic软件包管理器 > 文件 > 历史记录)。

12我只得到的是一个通过Synaptic安装的软件包列表,它并没有显示我通过更新管理器更新的所有软件包。 - Isaiah

现在也可以通过软件中心来完成这个操作!进入“历史”页面,你可以查看所有的更新和安装记录。

Software Center History


我猜是10.10吧? - vrcmr
当然是。我不认为这在之前的发行版中可用... - Nick Pascucci

对于我们来说,有一个稍微更容易和准确的答案来回答“上次我们修补这个东西是什么时候?”这个问题变得很有用。所以我把它整理了一下。我在12.04、14.04和16.04上进行了测试。它对于那个问题返回了相当准确的答案。 注意:“相当准确”可能不是“完全准确”。 注意:只针对那个问题。

示例输出:

xenial% 9: ./linuxpatchdate 
2016-07-19 54
2017-02-24 363
2017-03-08 7
2017-03-09 2

子程序和程序:
#!/usr/bin/perl

#------------------ subroutines --------------------

sub parseRecord {
    my $sdate = "";
    my $useful = 0;
    my $packages = 0;
    my @ptmp;
    while (my $recordLine = shift() ) {

       if ($recordLine =~ m/^Start-Date: ([\d\-]*).*/) {
          $sdate = $1;
       }
       elsif ($recordLine =~ m/^Commandline:.*upgrade/) {
          $useful = 1;
       }
       elsif ($recordLine =~ m/^Install: (.*)/) {
          $recordLine =~ s/\([^\)]*\)//g;
          @ptmp = split(/,/,$recordLine);
          $packages = $packages + $#ptmp + 1;
       }
       elsif ($recordLine =~ m/^Upgrade: (.*)/) {
          $recordLine =~ s/\([^\)]*\)//g;
          @ptmp = split(/,/,$recordLine);
          $packages = $packages + $#ptmp + 1;
       }
    }



    if ($useful) {
       return ($sdate,$packages);
    }
    else {
       return ("0",0);
    }
}


#------------------ main program --------------------

@lines = split(/\n/,`/bin/zcat -f /var/log/apt/history.log  /var/log/apt/history*gz`);
my %patchHash;
my $line;
my @inputLines;
my $pushDate = "";
my $pushNum = "";

foreach $line (@lines) {
    # all records separated by blank lines
    if ($line !~ /./) {
       # no-op
    }
    elsif ($line =~ m/^Start-Date: ([\d\-]*).*/) {
       @inputLines = ();
       push (@inputLines, $line);
    }
    elsif ($line =~ m/^End-Date: ([\d\-]*).*/) {
       ($pushDate, $pushNum) = parseRecord(@inputLines);
       if ($pushNum != 0) {
          $patchHash{$pushDate} += $pushNum;
       }
    }
    else {
       push (@inputLines, $line);
    }
}

foreach $pushDate (sort(keys(%patchHash))) {
   print "$pushDate $patchHash{$pushDate}\n";
}