bzip2 압축에서 손상되지 않은 모든 파일을 추출하는 방법은 무엇입니까?

bzip2 압축에서 손상되지 않은 모든 파일을 추출하는 방법은 무엇입니까?

다음 명령을 사용하여 bzip2 파일(~55GB)의 압축을 풀려고 하는데 tar -jxvf file.tar.bz2 특정 파일에서 압축 풀기 프로세스가 중단되고 오랜 시간 기다린 후 다른 파일의 압축을 풀지 않고 아래와 같은 오류 메시지가 나타납니다. .

bzip2: Compressed file ends unexpectedly;
        perhaps it is corrupted?  *Possible* reason follows.
bzip2: Inappropriate ioctl for device
        Input file = (stdin), output file = (stdout)

It is possible that the compressed file(s) have become corrupted.
You can use the -tvv option to test integrity of such files.

You can use the `bzip2recover' program to attempt to recover
data from undamaged sections of corrupted files.

tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now

마지막에 압축 풀다가 막힌 파일이 우연히 tar 파일이더군요. tar 파일에 관심이 없으면 tar 파일을 건너뛰고 계속해서 다른 파일을 추출할 수 있나요?

답변1

일반적으로 압축된 스트림이 어느 시점에서 손상되면 해당 시점 이후에는 아무것도 추출할 수 없습니다.

를 사용하는 것이 bzip2recover좋습니다만, 안타깝게도 실제로는 블록 길이가 조금씩 다릅니다. "기본값은 900k"는 근사치이며 각 청크의 길이는 약간 다릅니다(bzip2를 사용하여 큰 파일을 압축한 다음 bzip2를 사용하여 복원한 다음 몇 개의 청크를 추출하여 직접 확인하십시오).

어떤 블록이 손상되었는지 확인하려면 를 사용할 수 있습니다 bzip2 -tvv.

만약에손상된 블록의 압축되지 않은 길이를 알아낼 수 있습니다(예: 주변의 살아남은 블록을 읽고 그 사이에서 손실된 바이트 수를 추론하여). 손상된 블록을 대체하기 위해 해당 길이의 제로 패딩된 블록을 생성하려고 시도할 수 있습니다. 그런 다음 bzip2를 수행하고 추출을 위해 연결된 스트림을 tar stdin에 공급합니다(사용 bzip2 -dc rec*file.bz2 | tar -xapf -). 그런 다음 손상된 영역에 tar메타데이터 가 없으면 거의 모든 것을 추출합니다(전체 0 블록을 포함하는 파일 하나 제외).

그 길이를 알 수 없다면 완전히 운이 없는 것입니다. 일부 데이터(예: 비디오)의 경우 파일 중간에서 몇 바이트를 잘라낸 다음 tar를 사용하여 복원할 수 있습니다. 이는 허용되지 않습니다.

관련 정보