
對於 Linux tar 命令:
tar uf test.tar test.txt
但是對於*BSD bsdtar命令選項u = r =append,即無法更新文件,只能追加文件,而且我嘗試編譯自由檔案庫,證明bsdtar無法更新tar中的檔案。
那麼,為什麼Linux中的tar指令可以更新tar歸檔中的文件,而bsdtar卻不能。
答案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”(加上文件元資料標頭)附加到末尾仍然更容易(並且可能更快)。