将 RPM 名称解析为其组件

Tom*_*ime 19 rpm

官方 RPM 工具包中是否有名称解析工具?

我有一个文件名列表。每个都是 RPM 包的文件名。我没有实际的包,只有文件名。对于每个我需要提取包名称和版本($NAME 和 $VERSION)。我需要这个的原因是我正在编写一个脚本,然后确保“yum install $VERSION”安装 $VERSION。这是构建包并验证它们是否正确上传的系统的一部分。

文件名列表如下所示:

$ cat /tmp/packages.txt
/home/builder/packages/testing-dev/CentOS/6/x86_64/emacs-mercurial-2.8-3.el6.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/emacs-mercurial-el-2.8-3.el6.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/mercurial-2.8-3.el6.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/mercurial-hgk-2.8-3.el6.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/python-redis-2.8.0-2.el6.noarch.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/redis-2.6.16-1.el6.1.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/sei_dnsmaster-1.0-99.el6.x86_64.rpm
Run Code Online (Sandbox Code Playgroud)

我发现以下代码是执行任务的 BASH 函数:

function parse_rpm() { RPM=$1;B=${RPM##*/};B=${B%.rpm};A=${B##*.};B=${B%.*};R=${B##*-};B=${B%-*};V=${B##*-};B=${B%-*};N=$B;echo "$N $V $R $A"; }

for i in $(</tmp/packages.txt) ; do
    parse_rpm $i
done
Run Code Online (Sandbox Code Playgroud)

有用。大多。有一些例外:

$ parse_rpm CentOS/6/x86_64/sei_dnsmaster-1.0-99.el6.x86_64.rpm
sei_dnsmaster 1.0 99.el6 x86_64
Run Code Online (Sandbox Code Playgroud)

请注意,它没有正确获取版本(应该是 1.0-99)

我想知道 (1) rpmdev 包中是否有一个工具可以正确执行此操作。(2) 如果没有,是否有我可以使用的官方正则表达式。(3) 那个正则表达式的python 等价物是什么?

提前致谢!

Mic*_*ton 25

你不需要做任何这些;RPM 有一个查询格式参数,可让您准确指定要接收的数据。如果您不指定它们,它甚至会输出没有行尾。

例如:

rpm --queryformat "%{NAME} %{VERSION} %{RELEASE} %{ARCH}" -q coreutils
rpm --queryformat "The version of %{NAME} is %{VERSION}\n" -q coreutils

rpm --queryformat "%{NAME} %{VERSION} %{RELEASE} %{ARCH}" -qp file.rpm
Run Code Online (Sandbox Code Playgroud)

您可以使用的完整变量列表可以通过以下方式获得:

rpm --querytags
Run Code Online (Sandbox Code Playgroud)

请注意,在 的情况下RELEASE,输出 like84.el6是正常和预期的,因为这实际上是 RPM 包在由分发包或为分发包打包时的版本控制方式。

  • @TomOnTime - “仅适用于已安装的软件包” 不正确 - 您错过了第三个示例中的 -p 选项: rpm --queryformat "%{NAME} %{VERSION} %{RELEASE} %{ARCH}" -qp 文件.rpm (7认同)
  • 我希望我早点知道。RPM 工具只处理包内容;文件名完全无关(这个答案对你不起作用)。 (4认同)
  • 这仅适用于已安装的软件包。我想操作文件名。`$ rpm --queryformat "%{NAME} %{VERSION} %{RELEASE} %{ARCH}" -q CentOS/6/x86_64/sei_dnsmaster-1.0-84.el6.x86_64.rpm 包 CentOS/6/x86_64/ sei_dnsmaster-1.0-84.el6.x86_64.rpm 未安装` (2认同)

Tom*_*ime 16

有人告诉我,在 Python 中做我所寻求的事情的官方方法是:

from rpmUtils.miscutils import splitFilename

(n, v, r, e, a) = splitFilename(filename)
Run Code Online (Sandbox Code Playgroud)

我编写了一个简短的 Python 程序来满足我的需要。我会将脚本提供给 rpmdev 项目以供包含。