
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 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의 이전 버전과 새 버전이 모두 포함되어 있습니다.
좋아요, 그럼 질문의 핵심까지 말씀드리겠습니다
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"(파일 메타데이터 헤더 포함)를 추가하는 것이 여전히 더 쉽고 훨씬 더 빠를 수 있습니다.