tbz 파일에 파일 추가

tbz 파일에 파일 추가

저는 수천 개의 .tbz 아카이브 파일을 업데이트하는 방법을 찾고 있으므로 이를 위해 쉘 스크립트를 사용할 것입니다. 각 파일마다 파일을 추가해야 합니다.

내 질문은, 각 tbz의 내용을 추출한 다음 포함된 tar에 포함된 새 파일로 다시 압축하지 않고 이 작업을 수행하는 더 빠른 방법이 있습니까? 명령은 어떤 모습일까요?

감사해요

답변1

tar기존 아카이브에 파일을 추가할 수는 있지만 압축할 수는 없습니다. bunzip2표준 타르볼을 남겨두고 아카이브를 압축 해야 합니다 . 그런 다음 tar이 기능을 사용하여 기존 아카이브에 파일을 추가한 다음 재압축을 사용할 수 있습니다 bzip2.

매뉴얼에서:

 -r      Like -c, but new entries are appended to the archive.  Note that this only
         works on uncompressed archives stored in regular files.  The -f option is
         required.

답변2

또 다른 대답맞습니다. 압축을 풀지 않으면 압축된 tar 아카이브를 올바르게 업데이트할 수 없습니다.GNU tar 문서메시지를 표시하면 명시적인 오류 메시지와 함께 업데이트 시도가 실패합니다.

$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2 
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now

하지만,압축 해제가 필요하지 않은 지저분한 작업 솔루션에 관심이 있다면 다음 관찰을 기반으로 솔루션을 제안할 수 있습니다.

  • 추가된 bzip2 스트림 사용 cat및 유효한 bzip2 스트림 생성을 지원합니다(gzip도 마찬가지).
  • 추가된 tar를 사용하면 cat유효한 tar 파일이 생성되지 않습니다. 이것이 바로 --concatenate이 옵션이 존재하는 이유입니다. 하지만 tar에 유효한 척하도록 요청할 수 있습니다.

이 작업을 사용하는 대신 cat을 사용하여 두 개의 아카이브를 결합하기를 원하거나 시도하는 것이 더 직관적으로 보일 수 있습니다. --concatenate결국 cat은 파일을 결합하는 유틸리티입니다.

그러나 tar 아카이브에는 연결된 아카이브를 하나의 아카이브로 올바르게 읽으려면 제거해야 하는 파일 끝 표시가 포함되어 있습니다. --concatenate각각의 새 아카이브를 추가하기 전에 대상 아카이브에서 아카이브 끝 마커를 제거합니다. cat을 사용하여 아카이브를 병합하면 결과는 유효한 tar 형식 아카이브가 아닙니다. cat 유틸리티를 사용하여 추가된 아카이브에서 파일을 검색해야 하는 경우 --ignore-zeros( -i) 옵션을 사용하십시오.

이 지식을 바탕으로 우리는 다음과 같은 작업을 수행할 수 있습니다.

cat {one,two}.tar.bz2 >combined.tar.bz2

위의 문서 조각에서 설명했듯이 이로 인해 잘못된 tar 파일이 생성되지만 다음을 --ignore-zeros사용하여 여전히 완전히 읽을 수 있습니다.

## Show contents of `one.tar.bz2'
$ tar tf one.tar.bz2
a
b

## Show contents of `two.tar.bz2'
$ tar tf two.tar.bz2
c

## Show contents of `combined.tar.bz2', bypassing the bad format
$ tar tif combined.tar.bz2
a
b
c

위의 방법은 원본 두 아카이브의 세 파일을 모두 나열하는 동시에 -i첫 번째 원본 아카이브의 파일만 (올바르게) 나열하지 않고 나열하는 방법에 유의하세요.

$ tar tf combined.tar.bz2 
a
b

다시 말하지만 이것은 더러운 속임수에 지나지 않지만 -i쓰기와 읽기 측면을 모두 제어하고 이런 방식으로 생성된 파일을 읽으려고 할 때 사용되는지 확인할 수 있다면 유용할 수 있습니다.

관련 정보