![根据用途识别需要删除的软件包](https://linux22.com/image/912268/%E6%A0%B9%E6%8D%AE%E7%94%A8%E9%80%94%E8%AF%86%E5%88%AB%E9%9C%80%E8%A6%81%E5%88%A0%E9%99%A4%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%8C%85.png)
有没有办法识别包,也许通过分析包中的文件及其最后访问的时间,来确定包最后被使用的时间?
针对这一问题,可能存在现成的解决方案吗,甚至 apt 的一部分可能已经可以向我展示这一点?
识别很少使用或不再使用的软件包和应用程序并可能从系统中删除以释放空间会很有帮助。(至少这是我试图实现的)。
答案1
虽然我确信有一种方法可以仅使用 Bash 脚本来实现这一点,但我dpkg
用 Ruby 编写了一个小脚本(无论如何它都会调用 shell 命令来执行)。
它的作用是:
- 调用
dpkg -S /usr/bin/*
以获取每个文件所属的所有包的列表/usr/bin
。 - 通过比较包中每个文件的最后访问文件( ),从同一目录中构建每个包的数组,其中包含文件的最新日期,
atime
并按时间对列表进行排序 - 将结果输出到制表符分隔的文件
更好的方法可能是检查每个包,列出包中的所有文件,并找出每个文件的最后访问时间,从而找出每个包的最大访问时间。(这听起来应该可以用一些单行 Bash 脚本来实现)。
也许有人能好心提供一个可以完成同样功能的仅限 Bash 的版本?
# Obtain a list of files in /usr/bin with the corresponding package they belong to:
packfiles = (`dpkg -S /usr/bin/* 2>/dev/null`).split("\n") # errors written to /dev/null
# For each executable in a package, get the last accessed time and save the latest time per package
packagetimes = packfiles.reduce({}) {|packages, pf|
package, file = pf.split(' ') # Split line into package name and file path
package.chomp!(':') # Remove last colon after package name
packages[package]
lat = open(file).atime # Get the last accessed time of the file
#Take greater of package last change time or time for file for package:
packages[package] = (packages[package] && packages[package] > lat ? packages[package] : lat)
packages #for next reduce iteration
}.
# Produce a sorted list of packages and times
reduce([]) {|arr, entry| arr << [entry[0],entry[1]] }. # Create array with package, time
sort_by {|line| line[1]} # Sort array by time
# Write out the list of packages and times
open('./pusage.txt', 'w') {|out|
packagetimes.each {|pt|
out << "#{pt[0]}\t#{pt[1]}\n"
}
}
您可以像我一样进行测试,通过运行某个包中的二进制文件并观察,当您再次运行该脚本时,包旁边的时间戳会发生变化并将其移动到列表的底部。
这对我来说是可行的,尽管我仍然有点犹豫是否删除某些软件包,尽管它们的使用似乎可以追溯到我在机器上安装系统的时候。