저는 수천 개의 .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
쓰기와 읽기 측면을 모두 제어하고 이런 방식으로 생성된 파일을 읽으려고 할 때 사용되는지 확인할 수 있다면 유용할 수 있습니다.