обновить файл в tar

обновить файл в tar

для 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

для *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" является сокращением от "tape archive". Команда предназначена для использования с архивами, хранящимися на последовательных носителях, таких как лента. Ленточный накопитель не может вставлять новые отрезки ленты в середину ленты, а также не может вырезать существующие разделы ленты. Он также не может считывать данные одновременно с записью. Чтобы преобразовать ленту с содержимым a.txt, b.txt, c.txt в ленту с большим b.txt, сначала необходимо считать всю ленту, сохранить ее содержимое (в памяти или на диске), а затем перемотать ленту и полностью записать новое содержимое. Быстрее будет найти метку конца ленты и добавить новую версию b.txt.

Кроме того, многие ленточные накопители (например, DAT) автоматически добавляют метку конца ленты в конце каждой операции записи, и это невозможно предотвратить. Поэтому перезапись даже b.txt того же или меньшего размера в его существующей позиции оставит c.txt навсегда недоступным.

проблемы с файловой системой

Невозможно заменить содержимое в середине файла содержимым, имеющим другую длину. Чтобы заменить файл, содержащий "bbb", файлом, содержащим "bbbbbb", необходимо прочитать старый файл и записать новый. Поэтому все еще проще (и может быть значительно быстрее) добавить "bbbbbb" (плюс заголовок метаданных файла) в конец.

Связанный контент