Tar

如何將大文件添加到存檔並並行刪除

  • September 23, 2017

假設我/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到 next dd,然後將fallocate起始偏移量增加到-o 10GiB。最後添加一些 nul 字元來填充最終的 tar 文件。


如果您的文件系統不支持fallocate,您可以執行類似的操作,但從文件末尾開始。首先將文件的最後 10GB 複製到一個名為part8. 然後使用truncate命令減小原始文件的大小。以類似的方式進行,直到您有 8 個文件,每個文件 10Gibyte。然後,您可以連接標題和part1bigarchive.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.

因此,只要數據壓縮器/歸檔器正在從文件中讀取,該文件就會一直存在,佔用文件系統中的空間。

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