由于某种原因,我在我的 Linux 发行版(Fedora/CentOS/Debian/Ubuntu/Arch/...)上安装了很多软件包。其中一些仅供一次性使用。但每当我使用包管理器运行完整的系统升级时,它们都会包含在升级中。在这种情况下,那些一次性包只会浪费时间和带宽,因为实际上不再需要它们。因此我想弄清楚它们到底是什么并删除它们。
我知道一些包管理器允许您将包安装为依赖项,以便在删除下游包时自动删除它们。但有时我在安装软件包时忘记添加此选项,并且其中一些软件包是由未使用as-依赖选项。所以目前的情况是,我不知道哪些包不再使用了。
我认为识别这些包的一种方法是跟踪包文件的上次访问时间。但我不知道使用任何流行的包管理器(dnf/yum/apt/pacman/...)来执行此操作的方法。它们中的任何一个是否具有这样的功能或类似的功能,可以让我识别并删除那些一次性软件包?这样做的一种麻烦方法是获取所有包的完整文件列表并按其访问时间排序。但在我这样做之前,我想确保我没有重新发明轮子(即制作包管理器已经拥有的东西)。
答案1
在 Debian/Ubuntu 上,这为您提供给定包中任何文件的最近访问时间:
function package_access { dpkg-query -L $1 | xargs stat -c '%F %n' | grep '^regular file ' | sed 's/^regular file //' | xargs stat -c '%x' | sort -r | head -1 ; }
(如果名称中没有空格/括号)。
因此,您可以通过以下方式列出您的软件包及其最新访问时间:
( for p in $(dpkg-query -f '${Package}\n' --show); do echo "$(package_access "$p") $p" ; done ) | sort -r
(它将运行一段时间并输出很多垃圾,请参阅上面的警告)
奇怪的是,在我 2017 年 5 月安装的 Ubuntu 16.04 上,它发现访问时间可以追溯到 2007 年的软件包(tk
因为它只是真实文件/usr/share/doc/tk/copyright
)。但是访问此类包中的一个文件会将 package_access 输出恢复到当前状态。