我想知道从 TAR 包列表中提取每个 RPM 文件并从这些文件中获取包信息的可能最佳时间案例解决方案。
因此,我在一个目录中有一份 tar 包列表,其中至少包含一个 RPM。对于这些,我尝试了最简单的解决方案,使用 bash 脚本循环、提取并峰值到每个 RPM 包中,考虑到 TAR 包超过 20 个,这需要花费大量时间。
我还尝试使用 进行批量提取cat *.tar | tar -xvf - -i
,然后 rpm -qp #list of files
获取包名称,这比上一种方法有所改进。
我知道我可以查看 TAR 包并获取 .rpm 文件名,但由于包含包的文件的名称与包的名称无关,因此我还需要检查 RPM 包。
我可以尝试的最接近的解决方案是:
# given tarball-containing-wget-rpm-package.tar.gz contains wget.rpm
bash$ time (cat tarball-containing-wget-rpm-package.tar.gz|gunzip|tar --wildcards --extract '*.rpm' --to-stdout|rpm -qp /dev/stdin)
wget-1.11.4-1.40.1
real 0m0.049s
user 0m0.044s
sys 0m0.004s
这相当快,但如果 TAR 包包含多个 RPM 文件,则无法提供正确的信息。
所以,我要问的是:
- 我可以将所有 TAR 文件批量提取到 stdout 并查看 RPM 文件吗?
- 我可以在不从 TAR 包中提取文件的情况下执行此操作吗?
- 如何修改上述命令以使用包含多个 RPM 的单个 TAR 包?
答案1
鉴于该rpm
命令可以正确处理一个文件stdin
,但在涉及多个文件时会失败,以下方法是一种潜在的解决方案。
使用 GNU tar
,您可以使用该--to-command
选项将每个文件的内容发送到rpm
命令。
tar -zf tarball.gz --wildcards --extract '*.rpm' --to-command='rpm -qp /dev/stdin'
来自手动的:
--to-command=command
提取文件并将其内容通过管道传输到标准输入命令。使用此选项时,tar 不会创建指定的文件,而是调用命令并将文件的内容通过管道传输到其标准输出。这命令可能包含命令行参数(有关更多详细信息,请参阅运行外部命令)。
注意,那命令对于提取的每个常规文件执行一次。使用此选项时,非常规文件(目录等)将被忽略。