for *BSD bsdtar command option u = r = append, that is can't update file
Acho que os dois acrescentam, man tar
no Linux diz
-r, --append
append files to the end of an archive
…
-u, --update
only append files that are newer than the existing in archive
Aqui está um teste para provar isso
$ 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
Observe que o arquivo tar agora contém versões antigas e novas de b.txt
OK, então, para o início da sua consulta
why tar command in Linux can update file in tar archive,but bsdtar can't.
Você pode instalar o Gnu Tar no BSD em /usr/local/bin/gtar
.
Veja informações do pacote para gtar-1.21-static.tgz (sh)
Atualização:
Why can't tar update in-place?
acesso aleatório vs mídia serial
O nome "tar" é uma contração de "archive de fita". O comando destina-se a ser usado com arquivos armazenados em mídia serial, como fita. A unidade de fita não pode inserir novos comprimentos de fita no meio de sua fita, nem pode cortar seções existentes de fita. Nem pode ler ao mesmo tempo que escrever. Para transformar uma fita com o conteúdo a.txt, b.txt, c.txt para um com um b.txt maior, primeiro a fita inteira deve ser lida, o conteúdo armazenado (na memória ou no disco) e depois a fita rebobinada e o novo conteúdo escrito por extenso. É mais rápido procurar a marca de fim de fita e anexar a nova versão de b.txt.
Além disso, muitas unidades de fita (por exemplo, DAT) adicionam automaticamente uma marca de fim de fita no final de cada operação de gravação e isso não pode ser evitado. Portanto, reescrever mesmo um b.txt do mesmo tamanho ou menor em sua posição existente deixaria o c.txt permanentemente inacessível.
problemas no sistema de arquivos
Não é possível substituir o conteúdo no meio de um arquivo por um conteúdo de duração diferente. Para substituir um arquivo contendo "bbb" por um arquivo contendo "bbbbbb", você deve ler o arquivo antigo e gravar um novo arquivo. Portanto, ainda é mais fácil (e pode ser consideravelmente mais rápido) anexar "bbbbbb" (além do cabeçalho de metadados do arquivo) ao final.