1

для Linux команда tar:

tar uf test.tar test.txt

но для * BSD опция команды bsdtar u = r = append, то есть не может обновить файл, только может добавить файл, а также, я пробую скомпилированный libarchive , доказал, что bsdtar не может обновить файл в tar.

Итак, почему команда tar в Linux может обновить файл в архиве tar, а bsdtar - нет.

обратитесь к:tar (Linux) tar (OpenBSD)

1 ответ1

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.

ОК, так что к вашему запросу

почему команда 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" (плюс заголовок метаданных файла) в конец.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .