如何使用“ aptitude”查看在给定日期安装的软件包?


54

有谁知道使用aptitude(或apt-get)时是否有一种简便的方法来查找已安装软件包的列表(按日期排序)?

我安装了一堆软件包尝试新的东西,但是没有成功。我想删除所有这些软件包,以获取一些磁盘空间。

我尝试只查看下载的.deb文件列表,但这似乎是一种相当落后的方法(尽管它确实起作用了)。

Answers:


43

不幸的是,尽管有添加dpkg的想法,但它并没有专门保存软件包的安装日期。但是,可以通过查看写入目录的文件的日期戳来找到安装日期/var/lib/dpkg/info


4
如果使用这种方法,请确保仅检查*.list文件上的时间戳,因为其他文件上都标有打包日期。
戴夫2012年

20

我已经配置了写入日志(/var/log/aptitude)的能力。它产生这样的输出;

Aptitude 0.4.11.11: log report
Mon, Feb  9 2009 13:21:28 +0100

IMPORTANT: this log only lists intended actions; actions which fail due to
dpkg problems may not be completed.

Will install 6 packages, and remove 0 packages.
4096B of disk space will be used
===============================================================================
[UPGRADE] apt 0.7.20.1 -> 0.7.20.2
[UPGRADE] apt-utils 0.7.20.1 -> 0.7.20.2
[UPGRADE] base-passwd 3.5.19 -> 3.5.20
[UPGRADE] libgnutls26 2.4.2-5 -> 2.4.2-6
[UPGRADE] libpq5 8.3.5-1 -> 8.3.6-1
[UPGRADE] ucf 3.0015 -> 3.0016
===============================================================================

Log complete.

这显示了正确安装的确切日期和软件包。要配置它,请遵循aptitude参考。

Option:Aptitude::Log

Default:/var/log/aptitude

Description: If this is set to a nonempty string, aptitude will log the package
installations, removals, and upgrades that it performs. If the value of
Aptitude::Log begins with a pipe character (ie, ``|''), the remainder of its
value is used as the name of a command into which the log will be piped: for
instance, |mail -s 'Aptitude install run' root will cause the log to be emailed
to root. To log to multiple files or commands, you may set this option to a list
of log targets.

您可以在aptitude手册页中找到指向aptitude参考的链接。


1
请发布链接以及如何实现。仅参考一些手册不是很有帮助。
not2qubit

17

有一种简单的方法可以查看所有软件包的安装日期。只需执行:

grep " install" /var/log/dpkg.log*

结果,您将获得所有安装的软件包的列表,其中包含确切的日期和时间。

感谢您提出的解决方案。


2
cd如果您在cat命令中使用完整路径,则该命令不是必需的...
papukaija 2013年

1
cd命令的目的是ls在此目录中检查可用的dpkg.log文件。但是ls /var/log | grep 'dpkg.log',为了列出日志文件,将运行更好的解决方案。对不起,一团糟。
jmarceli

2
还是只是“ grep install /var/log/dpkg.log*”?
马克·范戴勒

1
I,我不知道cat | cat你能做些什么。但是,为什么不在一个命令中同时管理两个文件呢?(甚至更好:只要按照@MarcVanDaele所说的去做。)
mwfearnley

13

我在网上找到了这个。它从dpkg日志文件中创建dpkg的历史记录。

看起来很简单。

function apt-history(){
      case "$1" in
        install)
              cat /var/log/dpkg.log | grep 'install '
              ;;
        upgrade|remove)
              cat /var/log/dpkg.log | grep $1
              ;;
        rollback)
              cat /var/log/dpkg.log | grep upgrade | \
                  grep "$2" -A10000000 | \
                  grep "$3" -B10000000 | \
                  awk '{print $4"="$5}'
              ;;
        *)
              cat /var/log/dpkg.log
              ;;
      esac
}

资源

编辑

我在Ubuntu 8.10 Server上尝试了此脚本,并且效果很好。您能否提供一些信息,如何解决您的问题?


5
  • 使用dpkg日志

    locate dpkg.log | xargs cat {} | grep " install "
    
  • 或者如果你没有 locate

    find /var/log/ -name 'dpkg.log' | xargs cat {} | grep " install "
    
  • 使用sort以确保适当的基于时间的排序

    locate dpkg.log | xargs cat {} | grep " install " | sort
    
  • 使用tac(反向cat)*,如以获得最新的4项

    locate dpkg.log | xargs cat {} | grep " install " | sort | tac | head -n4
    

例如,对于最后一条命令,我得到:

2014-10-08 18:56:12 install xorg-server-source:all <none> 2:1.16.1-1
2014-10-08 18:49:34 install libelementary-data:all <none> 0.7.0.55225-1
2014-10-08 18:46:57 install e17:i386 <none> 0.17.6-1
2014-10-08 18:46:56 install libedje-bin:i386 <none> 1.8.6-2.1+b1

1
为什么用tac+ head代替tail
Zanna

1
已经有一段时间了,我已经忘记了为什么-但是很可能有一个很好的理由..或者我有一个金发碧眼的时刻:D
a20

4

您还可以通过检查/var/log/apt/term.log和较旧的文件term.log.1.gz等来跟踪以前的操作。它具有时间戳和安装过程中消息的完整日志。


2

[回答实际问题],是的,有一种简便的方法来查找在特定日期安装的软件包,即使它是使用apt-get在终端内部完成的。

如果您安装了可从Ubuntu软件中心免费安装的Synaptic软件包管理器,则只需打开其FILE菜单并选择“ History”选项。在那里,您可以找到按日期排列的所有已添加和已删除应用程序包的统计信息,无论它们是如何安装或删除的。


2

确实有一个“官方” pkginstall.sh脚本可以做到这一点。请遵循官方文档中的说明。简要地说,从上面的链接下载脚本,确保它是可执行的,然后运行:

~/pkginstalls.sh

这将pkginstalls.txt在您的主目录中创建文件,其中包含按日期排序的所有已安装软件包。

顺便说一句,这是脚本的内容:

#!/bin/bash
#pkginstalls.sh
#creates text file with a list of all packages installed by date

#first append all info from archived logs

i=2
mycount=$(ls -l /var/log/dpkg.log.*.gz | wc -l)
nlogs=$(( $mycount + 1 ))

while [ $i -le $nlogs ]
do
if [ -e /var/log/dpkg.log.$i.gz ]; then
zcat /var/log/dpkg.log.$i.gz | grep "\ install\ " >> $HOME/pkgtmp.txt
fi
i=$(( $i+1 ))

done

#next append all info from unarchived logs

i=1
nulogs=$(ls -l /var/log/dpkg.log.* | wc -l)
nulogs=$(( $nulogs - $nlogs + 1 ))
while [ $i -le $nulogs ]
do
if [ -e /var/log/dpkg.log.$i ]; then
cat /var/log/dpkg.log.$i | grep "\ install\ " >> $HOME/pkgtmp.txt
fi
i=$(( $i+1 ))

done

#next append current log

cat /var/log/dpkg.log | grep "\ install\ " >> $HOME/pkgtmp.txt

#sort text file by date

sort -n $HOME/pkgtmp.txt > $HOME/pkginstalls.txt

rm $HOME/pkgtmp.txt

exit 0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.