Tar
從大型 .tgz 中有效刪除文件
假設我有一個 gzip 壓縮的 tar-ballcompressedArchive.tgz(+100 個文件,總計 +5gb)。
刪除與給定文件名模式匹配的所有條目(例如 prefix*.jpg)然後將剩餘部分再次儲存在 gzip:ed tar-ball 中的最快方法是什麼?
替換舊存檔或創建新存檔並不重要,以最快的為準。
使用 GNU
tar
,您可以:pigz -d < file.tgz | tar --delete --wildcards -f - '*/prefix*.jpg' | pigz > newfile.tgz
與
bsdtar
:pigz -d < file.tgz | bsdtar -cf - --exclude='*/prefix*.jpg' @- | pigz > newfile.tgz
(
pigz
是的多執行緒版本gzip
)。您可以像這樣覆蓋文件本身:
{ pigz -d < file.tgz | tar --delete --wildcards -f - '*/prefix*.jpg' | pigz && perl -e 'truncate STDOUT, tell STDOUT' } 1<> file.tgz
但這是非常冒險的,特別是如果結果最終的壓縮程度低於原始文件(在這種情況下,第二個
pigz
可能最終會覆蓋第一個尚未讀取的文件區域)。