如何获取计算机上不属于任何软件包的文件列表?

我正在考虑编写一个脚本来完成以下任务:
  • 遍历 /usr/lib 目录中的每个文件。
  • 对每个文件执行 dpkg -s 搜索。
  • 报告一个列表,列出不属于任何 .deb 软件包的“孤立”文件。
我的想法是,随着时间的推移,我安装了很多通过 make install 安装的软件,并且我想获取从我之后删除的手动安装软件中剩余的文件列表。

将来,确保您在安装包管理系统之外的所有内容都安装到/usr/local或/opt目录下。这样您就能够实现清晰的分离。 - geirha
3个回答

find /usr/lib -type f -exec dpkg -S {} + 2>&1 >/dev/null | sed -r 's/^[^/]+//'

我现在要警告你:它很慢。

3更快的方法是:find /usr/lib -type f -exec dpkg -S {} + | grep 'no path found' - αғsнιη
1毫无异议。2012年的Oli不如2015年的好。我已经更新了它,现在它只返回一个文件列表。 - Oli

你可以运行以下命令。
join -t '' -v1 <(find /usr/lib | sort) \
               <(grep -h /usr/lib /var/lib/dpkg/info/*.list | sort -u)

/usr/lib中的文件列表与至少一个/var/lib/dpkg/info/<NAME>.list文件中存在的文件列表进行比较(由dpkg -S使用的文件)。 -v1选项将报告第一个列表中存在但第二个列表中不存在的文件。
在我的机器上,这个差异列表有5000多个命中,所以我怀疑它可能没有任何帮助。

对我来说速度真的很快。 - user1202136

sudo aptitude install cruft
man cruft
sudo addgroup cruft
sudo chmod g+rwx /var/spool/cruft
sudo chown root:cruft /var/spool/cruft
sudo addgroup $USER cruft
cruft -r cruftreport
sudo chown root:root /var/spool/cruft
less cruftreport

2我喜欢里面的“man cruft”,但是稍微解释一下什么是cruft以及为什么你推荐它会更好!:P ;-) - Fabby
这样行不通,更准确地说:(1)"chown: 在 ‘root:cruft’ 后缺少操作数"。需要写成:"sudo chown root:cruft /var/spool/cruft" 代替。(2)"sudo addgroup $USER cruft" 需要关闭/打开新的终端窗口(重新登录)。 (3)如果您想检查所有目录,则需要调用 "sudo cruft"。 - muenalan