tar의 업데이트 파일

tar의 업데이트 파일

Linux tar 명령의 경우:

tar uf test.tar test.txt

그러나 *BSD bsdtar 명령 옵션 u = r = 추가의 경우 파일을 업데이트할 수 없으며 파일을 추가할 수만 있고 컴파일을 시도합니다.도서관, bsdtar가 tar의 파일을 업데이트할 수 없다는 것이 입증되었습니다.

그렇다면 Linux의 tar 명령은 tar 아카이브의 파일을 업데이트할 수 있지만 bsdtar는 업데이트할 수 없는 이유는 무엇입니까?

인용하다: 타르(리눅스) 타르(OpenBSD)

답변1

*BSD bsdtar 명령 옵션 u = r = 추가, 즉 파일을 업데이트할 수 없습니다.

나는 둘 다 추가한다고 생각합니다. man tarLinux에서는 다음과 같이 말합니다.

   -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의 이전 버전과 새 버전이 모두 포함되어 있습니다.

좋아요, 그럼 질문의 핵심까지 말씀드리겠습니다

Linux의 tar 명령은 tar 아카이브의 파일을 업데이트할 수 있지만 bsdtar는 업데이트할 수 없는 이유입니다.

BSD에 Gnu tar를 설치할 수 있습니다 /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"(파일 메타데이터 헤더 포함)를 추가하는 것이 여전히 더 쉽고 훨씬 더 빠를 수 있습니다.

관련 정보