更新 tar 中的文件

更新 tar 中的文件

對於 Linux tar 命令:

tar uf test.tar test.txt

但是對於*BSD bsdtar命令選項u = r =append,即無法更新文件,只能追加文件,而且我嘗試編譯自由檔案庫,證明bsdtar無法更新tar中的檔案。

那麼,為什麼Linux中的tar指令可以更新tar歸檔中的文件,而bsdtar卻不能。

參考: 焦油 (Linux) 焦油 (OpenBSD)

答案1

對於 *BSD bsdtar 命令選項 u = r =append,即無法更新文件

我認為他們都附加了,man tar在 Linux 上說

   -r, --append
          append files to the end of an archive
   -u, --update
          only append files that are newer than the existing in archive

這是一個測試來證明這一點

$ uname -s
Linux
$ tar --version
tar (GNU tar) 1.15.1

$ echo aaa > a.txt
$ echo bbb > b.txt
$ echo ccc > c.txt

$ tar cvf x.tar *txt
a.txt
b.txt
c.txt

$ echo BBB > b.txt

$ tar -uvf x.tar b.txt
b.txt

$ tar tvf x.tar
-rw-rw-r-- ian/ian           4 2012-11-08 16:43:10 a.txt
-rw-rw-r-- ian/ian           4 2012-11-08 16:43:17 b.txt
-rw-rw-r-- ian/ian           4 2012-11-08 16:43:26 c.txt
-rw-rw-r-- ian/ian           4 2012-11-08 16:48:22 b.txt

請注意,tar 檔案現在包含 b.txt 的舊版本和新版本

好的,接下來是您的查詢的核心

為什麼 Linux 中的 tar 指令可以更新 tar 壓縮包中的文件,而 bsdtar 卻不能。

您可以在 BSD 中安裝 Gnu tar /usr/local/bin/gtar

gtar-1.21-static.tgz (sh) 的軟體包資訊


更新:

為什麼 tar 不能就地更新?

隨機存取與串行媒體

「tar」這個名稱是「tape archive」的縮寫。該命令旨在與儲存在串行媒體(例如磁帶)上的存檔一起使用。磁帶機無法將新長度的磁帶插入磁帶中間,也無法剪切磁帶的現有部分。它也不能在寫作的同時進行閱讀。要將包含a.txt、b.txt、c.txt 內容的磁帶轉換為包含更大b.txt 的磁帶,首先必須讀取整個磁帶,將內容儲存在記憶體或磁碟上,然後將磁帶倒帶並新內容寫得完整。尋找磁帶結束標記並附加 b.txt 的新版本會更快。

此外,許多磁帶驅動器(例如 DAT)會在每次寫入作業的末尾自動添加磁帶末尾標記,並且這是無法阻止的。因此,即使在現有位置重寫相同大小或更小的 b.txt 也會導致 c.txt 永久無法存取。

檔案系統問題

無法以不同長度的內容取代文件中間的內容。要將包含“bbb”的文件替換為包含“bbbbbb”的文件,您必須讀取舊文件並寫入新文件。因此,將“bbbbbb”(加上文件元資料標頭)附加到末尾仍然更容易(並且可能更快)。

相關內容