.png)
TAR バンドルのリストから各 RPM ファイルを抽出し、それらのファイルからパッケージ情報を取得するための、考えられる最善のケース ソリューションを知りたいです。
つまり、ディレクトリ内に少なくとも 1 つの RPM を含む tar バンドルのリストがあります。これらに対して、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
は 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 回実行されます。このオプションを使用すると、通常以外のファイル (ディレクトリなど) は無視されます。