on  it road.com

如何从 RPM 包文件中提取文件

有时,我们可能想要获取 RPM 包的内容或者单个文件。
为此,我们可以使用 rpm2cpio 转换工具。
rpm2cpio 工具以 CPIO 而非 TAR 存档的形式提取源或者二进制 RPM 的内容。
rpm2cpio 输出被写入标准输出并通常通过管道传输到 cpio 命令中。

1. 列出包文件中的文件

在此示例中,我们使用 -t 选项来指示 cpio 生成由 rpm2cpio 创建的存档的“目录”。
当我们想要提取文件时,这可以更容易地获得正确的文件名和路径。

$ rpm2cpio bash-3.1-16.1.x86_64.rpm | cpio -t

请注意,“rpm -qpl”命令将文件名显示为绝对路径“/bin/bash”,但“cpio -t”输出使用“./bin/bash”相对路径名。
这非常方便,因为我们可以作为普通用户使用 rpm2cpio 来提取通常会安装到特权目录中的文件。

以下示例显示了输出的显示方式:

$ rpm2cpio bash-3.1-16.1.x86_64.rpm | cpio -t
./bin/bash
./bin/sh
./etc/skel/.bash_logout
./etc/skel/.bash_profile
./etc/skel/.bashrc
...
10510 blocks

2.从一个包文件中提取一个或者多个文件

使用 rpm2cpio 生成 CPIO 存档,并使用 cpio "-i" 开关提取所需文件:

$ rpm2cpio bash-3.1-16.1.x86_64.rpm | cpio -ivd ./bin/bash
./bin/bash
10510 blocks
$ ls -l /home/user/bin/bash
total 744
-rwxr-xr-x 1 user user 753720 March  1 13:10 bash

在这种情况下,选项“-i”、“-v”和“-d”将cpio定向到:
-i 从存档中提取一个或者多个文件。
请求的文件名必须与“cpio -t”目录完全匹配,或者是类似 shell 的通配符模式。
如果目标文件已经存在,cpio 将拒绝覆盖它,除非在命令中添加“-u”开关。

-d 创建任何位于 cpio 命令中指定的文件名之前的目录。
如果目录已经存在,则可以省略“-d”开关,但如果始终指定它也无害。

-v 以 512 字节的块显示处理的任何文件的名称以及 CPIO 存档文件的大小。
请注意,此大小不是 cpio 从未直接看到的 RPM 包的大小。

如果没有给出文件名,则将提取所有 RPM 文件。

列出 RPM 包内的文件

我们可以通过执行 RPM 查询并添加“-p”开关来获取 RPM 中的文件列表:

$ rpm -q -l -p bash-3.1-16.1.x86_64.rpm
/bin/bash
/bin/sh
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
...
如何在不安装RPM包的情况下提取它

通常会安装 RPM 的文件内容。
这意味着 RPM 文件被复制到文件系统中的正确位置,以便它们可以被使用。
例如,安装 bash 二进制 RPM 会将“/bin/bash”文件放入其预期位置。
要安装 RPM,请使用“-i”或者“-U”开关:

$ rpm -ivh bash-3.1-16.1.x86_64.rpm
日期:2020-09-17 00:13:37 来源:oir作者:oir