%20%E5%A4%9A%E5%80%8B%20RPM%20%E6%96%87%E4%BB%B6%EF%BC%8C%E6%AF%8F%E5%80%8B%E6%96%87%E4%BB%B6%E6%8D%86%E7%B6%81%E5%9C%A8%E4%B8%8D%E5%90%8C%E7%9A%84%20TAR%20%E6%96%87%E4%BB%B6%E4%B8%AD.png)
我想知道從 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 不會建立指定的文件,而是調用命令並將文件的內容透過管道傳輸到其標準輸出。這命令可能包含命令列參數(有關更多詳細信息,請參閱運行外部命令)。
注意,那命令對於提取的每個常規文件執行一次。使用此選項時,非常規文件(目錄等)將被忽略。