Tar
如何將大文件添加到存檔並並行刪除
假設我
/root/bigfile
在 100GB 系統上有一個 80GB 的文件,並且想將此文件放入存檔中/root/bigarchive.tar
我顯然需要在將它添加到存檔的同時刪除它。因此我的問題是:
如何在將文件添加到存檔的同時刪除文件?
單個文件的未壓縮 tar 存檔由標題、文件和尾隨填充組成。所以你的主要問題是如何將 512 字節的標題添加到文件的開頭。您可以從僅使用標題創建想要的結果開始:
tar cf - bigfile | dd count=1 >bigarchive.tar
然後複製你文件的前10G。簡單來說,我們假設您的 dd 一次可以讀/寫 1Gib:
dd count=10 bs=1G if=bigfile >>bigarchive.tar
我們現在從原始文件中釋放複製的數據:
fallocate --punch-hole -o 0 -l 10GiB bigfile
這會將數據替換為不佔用文件系統空間的*稀疏零。*以這種方式繼續,將 a 添加
skip=10
到 nextdd
,然後將fallocate
起始偏移量增加到-o 10GiB
。最後添加一些 nul 字元來填充最終的 tar 文件。如果您的文件系統不支持
fallocate
,您可以執行類似的操作,但從文件末尾開始。首先將文件的最後 10GB 複製到一個名為part8
. 然後使用truncate
命令減小原始文件的大小。以類似的方式進行,直到您有 8 個文件,每個文件 10Gibyte。然後,您可以連接標題和part1
到bigarchive.tar
,然後刪除part1
,然後連接part2
並刪除它,依此類推。
刪除文件並不一定會按照您的想法進行。這就是為什麼在類 UNIX 系統中呼叫系統呼叫
unlink
而不是delete
. 從手冊頁:unlink() deletes a name from the filesystem. If that name was the last link to a file and no processes have the file open, the file is deleted and the space it was using is made available for reuse. If the name was the last link to a file but any processes still have the file open, the file will remain in existence until the last file descriptor referring to it is closed.
因此,只要數據壓縮器/歸檔器正在從文件中讀取,該文件就會一直存在,佔用文件系統中的空間。