查找软件包管理器未安装的文件


8

我想获取我的Gentoo Linux系统中所有未由软件包管理器(Portage)安装的文件的列表。这是因为我想保持系统尽可能干净,删除所有无用的文件。

让我告诉你到目前为止我一直在尝试什么。首先,我生成属于Portage跟踪的某些程序包的所有文件的列表:

equery files "*" | sort | uniq > portage.txt

然后,我生成系统上所有文件的列表,除了那些我不在乎的文件:

find / \( -path /dev -o -path /proc -o -path /sys -o -path /media \
          -o -path /mnt -o -path /usr/portage -o -path /var/db/pkg \
          -o -path /var/www/localhost/htdocs -o -path /lib64/modules \
          -o -path /usr/src -o -path /var/cache -o -path /home \
          -o -path /root -o -path /run -o -path /var/run -o -path /var/tmp \
          -o -path /var/log -o -path /tmp -o -path /etc/config-archive \
          -o -path /usr/local/portage -o -path /boot \) -prune \
          -o -type f | sort | uniq > all.txt

最后,我得到了Portage未跟踪的所有文件的列表:

comm -13 portage.txt all.txt > extra.txt

一些统计:

wc -l portage.txt all.txt extra.txt
  127724 portage.txt
   78371 all.txt
    8438 extra.txt

如您所见,我仍然获得了超过八千个额外的文件。我想减少该数量,以便将更多的注意力集中在确实需要删除的文件上。

我注意到,在extra.txt有成千上万的文件,在一个小数量的目录,如/usr/lib64/gcc/usr/lib64/python2.7/usr/lib64/python3.2/usr/lib64/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o例如,该文件不在其中,portage.txt因为该文件存在/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o。在我的系统上/usr/lib是的符号链接/usr/lib64。因此,似乎需要正确处理符号链接才能获得更好的结果。也许通过添加portage.txt他们指向的所有文件。我真的不知道该怎么做。

另外,为什么portage.txt大于all.txt?既然Portage跟踪的文件是系统中所有文件的子集,这不是相反吗?

最后,我是否忘记了find命令中的任何其他位置也应排除在外?


1
“这是因为我想保持系统尽可能干净,删除所有闲置的文件。” —您是否已经花了比浪费的磁盘空间便宜的时间?:)
poige 2012年

好吧,我应该说过,它也用于查找属于尚未通过软件包管理器安装的软件包的文件。我需要一个程序,但是没有可用的最新ebuild,而且我还没有学习如何正确编写ebuild。
Francesco Turco 2012年

这可能是有益的:us.generation-nt.com/answer/...
编辑。

Answers:


2

您正在寻找的可能是qfile。它是app-portage/portage-utils软件包的一部分,并提供option -o--orphans。您可以使用类似

find /usr/bin | xargs -I{} qfile -o {}

获取。中的孤立文件列表/usr/bin

备注:可悲的是,qfile在当前的稳定版本的portage-utils中,不支持从stdin读取qfile -o $(find /usr/bin),如果发现结果集很大,则qfile手册页中提到的解决方案不起作用,因此我们必须解决它一点点,使用xargs

顺便说一句,这不是我自己想出的,但是我在游丝线程上找到了,这是yvasilev的评论


Gentoo不使用Debian软件包管理器。
vonbrand,2016年

1
真正。Gentoo使用可移植性。就像原始问题明确指出的那样。谁想知道如何在Debian系统上查找孤立的文件?
luttztfz

0

IIRC,gentoo将软件包信息存储为纯文本格式(也许是/ var / db /),直接搜索可能很慢。

最好的方法是为所有程序包文件创建一个sqlitedatabase(或任何数据库),然后列出系统上的所有文件,在数据库中逐一查找它们,如果找不到,则不属于portage 。


0

portage.txt通过运行以下命令设法解决了与符号链接有关的问题:

equery files '*' | while read i; do readlink -e "${i}"; done | sort | uniq \
       > portage.txt

这用于放置portage.txt符号链接指向的文件,而不是符号链接本身。这是必需的,因为find创建的命令all.txt不会列出任何符号链接,而只会列出它们指向的文件,否则会产生很多误报。这是一个很慢的命令,因为它可以运行readlink数千个文件,但是我找不到更好的解决方案。任何建议都欢迎。

我了解的另一件事(这很容易)是为什么portage.txt比更大all.txt。这主要是由于我/usr/srcfind命令结果中显式修剪了目录及其下的所有文件,但equery无论如何都列出了它们。

即使没有出现问题,我所做的最后一件事是忽略Python内容(主要是__pycache__文件和带有.pyc.pyo后缀的文件):

grep '\(\.cpython-32\)\?\.py[co]$\|/__pycache__' candidates.txt \
     > candidates-bytecode.txt
sed -e 's/\(\.cpython-32\)\?\.py[co]$/.py/' \
    -e 's/\/__pycache__//' \
    candidates-bytecode.txt | sort | uniq \
    > candidates-bytecode-source.txt
comm -23 candidates-bytecode-source.txt portage.txt \
     > orphaned-bytecode.txt

这样,我可以跟踪所有Python东西的来源,并检查它们是否在中portage.txt。如您所见,我两次编写了相同的正则表达式,一次编写用于grep命令,另一次编写用于sed命令,但是也许可以在一个步骤中完成。


或许,这将是一个很大更快,只需使用cat /var/db/pkg/*/*/CONTENTS | sed -r 's/^... //; s/ ([0-9a-f]+ )[0-9]+$//; s/ -> .*$//'直接,而不是令人惊讶的慢Python的equery files '*'
Evi1M4chine
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.