有什么办法可以查到吗全部给定系统上的文件不是通过 RPM 安装?我知道我可以自己使用类似于rpmquery -f
循环遍历文件系统中所有文件的脚本中的东西来强制执行此操作,但是我想知道是否有一些标准方法可以为基于 RPM 的系统(特别是 Fedora,我在家)。由于这对于 Fedora 来说,使用yum
或dnf
弄清楚这一点是很好的。
如果没有标准的方法来做到这一点,有人知道一些预先存在的脚本可以做到这一点吗?如果不需要,我不想重新发明轮子。
聚苯乙烯还有一个与此类似的问题,但它是关于 Gentoo 和 Portage 的,所以它并不完全相关。
答案1
聚会有点晚了,但希望有人会发现这很有用:
find /usr/ -exec /bin/sh -c 'rpm -qf -- "$1" >/dev/null 2>&1 || echo "$1"' find_sh {} \;
此命令在文件系统上爬行并rpm -qf
在其上运行。rpm -qf
打印文件对应的包,幸运的是,如果找到 1,则返回值 0,否则返回 1。
如果你很勇敢,你可以将输出绑定到| xargs rm -f
,但就我个人而言,我不会那么勇敢。事实证明,里面有很多东西/usr
并不真正属于任何东西。
答案2
每https://superuser.com/questions/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
。
答案3
据我所知,使用某种专用命令是不可能的,只能通过一些脚本来实现。TL;DR - 请参阅底部的链接。对于基于 rpm 的系统或其他基于二进制的包管理器来说,这没有多大意义。此类包管理器通常是基于状态的机器,旨在跟踪它们自己安装的内容,而不是了解用户在包管理器“背后”潜入系统的所有内容。
对于不属于 rpm 文件的文件,您会在哪里划定界限?临时文件(想想 /tmp 和 /var/tmp )或缓存(想想 /var/cache )或用户创建的文件( /home 或 /srv 或其他用户定义的安装点)怎么样。
对于基于源代码的发行版,如果用例限制它们,那么提供该功能可能是有意义的FHS“系统”包使用的目录,如 /usr、/bin、/lib 等,而不是用于第三方软件的 /usr/local 或 /opt。
请参阅以下类似的问题,了解 scriptlet 来执行您所要求的操作: