Tar

從大型 .tgz 中有效刪除文件

  • March 28, 2020

假設我有一個 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可能最終會覆蓋第一個尚未讀取的文件區域)。

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