Tar

檢查 (rpm -qp) 多個 RPM 文件,每個文件捆綁在不同的 TAR 文件中

  • April 24, 2020

我想知道從 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 文件批量提取到標準輸出並查看 RPM 文件嗎?
  • 我可以在不從 TAR 包中提取文件的情況下執行此操作嗎?
  • 如何修改上述命令以使用包含多個 RPM 的單個 TAR 包?

鑑於該rpm命令可以正確處理一個文件,stdin並且在涉及多個文件時會失敗,因此以下方法是一種潛在的解決方案。

使用 GNU tar,您可以使用該--to-command選項將每個文件的內容髮送到rpm命令。

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

手冊

--to-command=command

提取文件並將其內容通過管道傳輸到command的標準輸入。使用此選項時,tar 不會創建指定的文件,而是呼叫命令並將文件的內容通過管道傳輸到其標準輸出。該命令可能包含命令行參數(有關更多詳細資訊,請參閱執行外部命令)。

請注意,對於提取的每個正常文件,該命令都會執行一次。使用此選項時會忽略非正常文件(目錄等)。

引用自:https://unix.stackexchange.com/questions/580665