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


9

有没有办法找出给定系统上所有通过RPM安装的文件?我知道我可以使用类似rpmquery -f脚本的方式强行执行此操作,该脚本可以在文件系统中循环遍历所有文件,但是我想知道是否存在某种标准方法可用于基于RPM的系统(特别是Fedora,我在家)。由于这对于Fedora来说,可以很好地使用yumdnf弄清楚。

如果没有标准方法可以执行此操作,那么有人知道某些预先存在的脚本可以执行此操作吗?如果不需要,我不想重新发明轮子。

PS:还有另一个与此类似的问题,但它与Gentoo和Portage有关,因此并不完全相关。


出于好奇,实际用例是什么?
doktor5000 '16

1
@ doktor5000我有一个家用台式机,在过去的几年中,我已经添加了大量的第三方软件。与其尝试手动查找我在rpm之外安装的每个文件,不如获取这些文件的列表,这样我会知道要手动复制的内容,在更新系统时重新安装,或者完全忽略。如果尝试Fedora进行原位升级,我运气不佳,所以我倾向于重新安装全新的。
eestrada '16

那么,也许首先将自己限制为基本存储库不附带的rpm包可能会更容易。另外,其他软件通常默认情况下安装在/ usr / local或/ opt中,这很容易检查,因为通常的发行版软件包都不使用。对于/ usr / bin,/ usr / share或/ usr / lib等类似的标准路径,您可能需要使用我的答案中链接的scriptlet方法之一。
doktor5000 '16

Answers:


5

晚会晚了一点,但希望有人会发现这很有用:

find /usr/ -exec /bin/sh -c "rpm -qf {} &> /dev/null || echo {}" \;

此命令在文件系统上进行爬网并rpm -qf在其上运行。rpm -qf打印文件的相应包,幸运的是,如果找到一个,则返回值为0,否则返回1。

如果您很勇敢,可以将输出绑定到| xargs rm -f,但就我个人而言,我不会那么勇敢。事实证明,/ usr中有很多东西并不是任何东西真正拥有的。


3

据我所知,使用某种专用命令是不可能的,只能通过少量脚本编写。TL; DR-请参阅底部的链接。对于基于rpm的系统或其他基于二进制的软件包管理器,这没有多大意义。此类软件包管理器通常是基于状态的计算机,旨在跟踪其自身安装的内容,而不了解用户在软件包管理器“背后”潜入系统的所有内容。

对于不属于rpm文件的文件,您会在哪里划清界线?临时文件(认为/ tmp和/ var / tmp)或缓存(认为/ var / cache)或用户创建的文件(/ home或/ srv或其他用户定义的安装点)呢?

对于基于源的发行版,如果用例将它们限制为“系统”软件包(例如/ usr,/ bin,/ lib等)使用的FHS目录,而不是例如/ usr / local或/,则可能需要提供该功能。选择第三方软件。


请参阅以下有关scriptlet的类似问题,以完成您要求的操作:


3

根据/superuser/555918/how-do-i-list-all-the-files-not-owned-by-any-package-in-a-rpm-based-system,以下命令是您所需的坚实基础:

comm -13 <(rpm -qla | sort) <(find / -type f | sort)

自定义进一步通过过滤find命令到感兴趣的目录(或者指定目录而不是列表中/(例如/{usr,bin})或排除等的文件夹/proc/dev/home,和/tmp


更详尽地讲:comm -13 <(rpm -qla | sort | uniq) <(find / -xdev \( -type f -o -type d -o -type l \) | sort) 这会列出(-l)所有已安装软件包()中的文件,rpm -qa并对它们进行排序,然后删除重复的文件(因为某些目录由多个软件包提供)。它还会找到根分区上的所有文件(不进入其他文件系统- -xdev),并返回所有文件,目录和符号链接(\( -type f -o -type d -o -type l \))。然后,它comm用于比较,而仅忽略rpm列表(-1)中的条目和两个列表()中的条目-3
IBBoard

还要注意,您可能需要sudo在find 上使用,以便可以找到只有root用户才能访问的文件(尤其是在/ etc下)。
IBBoard
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.