для * 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.
ОК, так что к вашему запросу
почему команда tar в Linux может обновить файл в архиве tar, а bsdtar - нет.
Вы можете установить Gnu tar в BSD в /usr/local/bin/gtar
.
См. Информацию о пакете для gtar-1.21-static.tgz (sh)
Обновить:
Почему нельзя обновить tar на месте?
произвольный доступ против последовательного носителя
Название "tar" является сокращением от "архива ленты". Команда предназначена для использования с архивами, хранящимися на последовательных носителях, таких как лента. Накопитель на магнитной ленте не может вставлять ленту новой длины в середину ленты, а также не может вырезать существующие участки ленты. Также он не может читать одновременно с письмом. Чтобы преобразовать ленту с содержимым a.txt, b.txt, c.txt в ленту с большим размером b.txt, сначала необходимо прочитать всю ленту, сохранить ее содержимое (в памяти или на диске), а затем перемотать ленту и новое содержание написано в полном объеме. Быстрее искать метку конца ленты и добавить новую версию b.txt.
Кроме того, многие ленточные накопители (например, DAT) автоматически добавляют метку конца ленты в конце каждой операции записи, и это невозможно предотвратить. Поэтому перезапись даже того же или меньшего размера b.txt в его существующей позиции сделает c.txt навсегда недоступным.
проблемы с файловой системой
Содержимое в середине файла невозможно заменить содержимым другой длины. Чтобы заменить файл, содержащий "bbb", на файл, содержащий "bbbbbb", необходимо прочитать старый файл и написать новый файл. Поэтому все еще проще (и может быть значительно быстрее) добавить "bbbbbb" (плюс заголовок метаданных файла) в конец.