![如何通过命令行显示 apt-get 包管理历史记录?](https://linux22.com/image/1074795/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%98%BE%E7%A4%BA%20apt-get%20%E5%8C%85%E7%AE%A1%E7%90%86%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%EF%BC%9F.png)
有没有办法通过命令行显示 apt-get 更改的包的历史记录?
答案1
所有使用 apt (apt-get) 的操作都会被记录下来。这些文件位于 /var/log/apt/ 中。要查看最新的历史日志,请执行:
less /var/log/apt/history.log
这些日志会被轮换(我猜每个月都会轮换),旧文件会以数字作为后缀并压缩。因此,要查看下一个历史日志,请使用:
zless /var/log/apt/history.log.1.gz
要查看可用的日志:
ls -la /var/log/apt/
答案2
您还可以创建简短的命令来显示有趣的内容。
将此自定义函数添加到您的
~/.bashrc
:### pars for fun: install | remove | rollback function apt-history(){ case "$1" in install) grep 'install ' /var/log/dpkg.log ;; upgrade|remove) grep $1 /var/log/dpkg.log ;; rollback) grep upgrade /var/log/dpkg.log | \ grep "$2" -A10000000 | \ grep "$3" -B10000000 | \ awk '{print $4"="$5}' ;; *) cat /var/log/dpkg.log ;; esac }
并在终端中像这样调用它:
kreso@h17:~$ apt-history install 2013-08-06 14:42:36 install gir1.2-nautilus-3.0:amd64 <none> 1:3.8.2-0ubuntu1~ubuntu13.04.1 2013-08-06 14:42:36 install python-nautilus:amd64 <none> 1.1-3ubuntu1 2013-08-06 14:42:37 install insync-nautilus:all <none> 1.0.20 2013-08-07 14:41:37 install powertop:amd64 <none> 2.1-0ubuntu1 2013-08-07 18:44:10 install libdiscid0:amd64 <none> 0.2.2-3build1 2013-08-07 18:44:11 install sound-juicer:amd64 <none> 3.5.0-0ubuntu1
取自这里
答案3
您还可以使用以下命令列出最近安装的软件包
grep "\ install\ " /var/log/dpkg.log
答案4
要获取特定软件包的更新历史记录(假设它是通过 apt 安装/更新的),这里有一个单行命令(bash 和 zgrep),示例针对软件包 skypeforlinux:
package='skypeforlinux'; pregex="(${package}[^\)]+\))"; while read -r line; do [[ "$line" =~ ^Start-Date:[[:space:]]([[:digit:]].+) ]] && curdate="${BASH_REMATCH[1]} "; [[ "$line" =~ $pregex ]] && echo "$curdate ${BASH_REMATCH[1]}"; done < <(for i in `ls -tr /var/log/apt/history*`; do zgrep -B3 "$package" $i; done)
这将 grep apt 的 skypeforlinux 历史日志文件(包括前三行)以获取日期。然后迭代结果并回显相关日期和版本。
更换包裹变量值与您的包名称相同,甚至适用于多个包,只要它们以相同的字符串开头。
输出示例:
package='apache'; pregex="(${package}[^\)]+\))"; while read -r line; do [[ "$line" =~ ^Start-Date:[[:space:]]([[:digit:]].+) ]] && curdate="${BASH_REMATCH[1]} "; [[ "$line" =~ $pregex ]] && echo "$curdate ${BASH_REMATCH[1]}"; done < <(for i in `ls -tr /var/log/apt/history*`; do zgrep -B3 "$package" $i; done)
2017-10-19 15:00:09 apache2-utils:amd64 (2.4.18-2ubuntu3.5)
2017-11-24 14:24:45 apache-pom-java:amd64 (10-2build1, automatic)
2018-02-22 16:42:02 apache2-data:amd64 (2.4.18-2ubuntu3.5, automatic)
2018-02-26 15:34:34 apache2:amd64 (2.4.18-2ubuntu3.5)
2018-02-26 15:36:32 apache2-data:amd64 (2.4.18-2ubuntu3.5)
2018-02-26 15:40:50 apache2-data:amd64 (2.4.18-2ubuntu3.5, automatic)
2018-02-26 15:42:07 apache2:amd64 (2.4.18-2ubuntu3.5)
2018-02-26 15:42:39 apache2:amd64 (2.4.18-2ubuntu3.5)
2018-03-15 10:08:50 apache-pom-java:amd64 (10-2build1)
2018-04-20 08:55:07 apache2-data:amd64 (2.4.18-2ubuntu3.5, 2.4.18-2ubuntu3.8)
2018-07-06 08:55:11 apache2-data:amd64 (2.4.18-2ubuntu3.8, 2.4.18-2ubuntu3.9)