それぞれ異なる TAR ファイルにバンドルされている複数の RPM ファイルを検査 (rpm -qp)

それぞれ異なる TAR ファイルにバンドルされている複数の RPM ファイルを検査 (rpm -qp)

TAR バンドルのリストから各 RPM ファイルを抽出し、それらのファイルからパッケージ情報を取得するための、考えられる最善のケース ソリューションを知りたいです。

つまり、ディレクトリ内に少なくとも 1 つの RPM を含む tar バンドルのリストがあります。これらに対して、bash スクリプトを使用して各 RPM パッケージをループして抽出し、ピークするという最も簡単な解決策を試しましたが、TAR バンドルが 20 以上あるため、かなりの時間がかかります。

また、 を使用して一括抽出しcat *.tar | tar -xvf - -irpm -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は 1 つのファイルを正しく処理できますstdinが、複数のファイルが関係している場合は失敗します。そのため、次のアプローチが潜在的な解決策となります。

GNU ではtar--to-commandオプションを使用して各ファイルの内容をコマンドに送信できますrpm

tar -zf tarball.gz --wildcards --extract '*.rpm' --to-command='rpm -qp /dev/stdin'

からマニュアル:

--to-command=command

ファイルを抽出し、その内容を標準入力にパイプします。指示このオプションを使用すると、指定されたファイルを作成する代わりに、tarは指示ファイルの内容を標準出力にパイプします。指示コマンドライン引数を含めることができます (詳細については、「外部コマンドの実行」を参照してください)。

注意してください指示抽出される通常のファイルごとに 1 回実行されます。このオプションを使用すると、通常以外のファイル (ディレクトリなど) は無視されます。

関連情報