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