여러분은 가만히 계세요 제가 모두 고장낼게요

IT 지식, PC 모바일 문제 해결 그리고 종종 애니 게임 일상생활 근황을 종종 올리고 있어요!

냐.한국 자세히보기

Windows

깨지거나 손상된 tar.bz2 bzip2 압축 파일 복원하기

Kamilake 2021. 5. 9. 22:31
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

bzip2recover 명령을 사용해 깨진 압축 폴더를 복원해 보겠습니다.

7zip에서 tar.bz2 파일의 압축을 해제하려 하면


위와 같은 정말 온갖 오류가 발생합니다.

데이터 오류 : <파일명>.tar
CRC가 다릅니다 : <파일명>.tar
파일 '<파일명>'을(를) 압축파일로 열 수 없음
데이터의 예기치 않은 종료 : <파일명>.tar

이중에 해당되신다면 아래를 참고해 데이터를 복구해주세요.


리눅스 쉘(저는 윈도우 상에서 WSL을 통해 작업하도록 할게요)에서도 마찬가지로 풀리지 않습니다.

bzip2: Data integrity error when decompressing.

파일을 몇 번이고 다시 받아도 동일한 증상이 발생하고 있습니다.

이 파일을 복구해 보도록 하겠습니다.

리눅스에서 작업하신다면 최고입니다. 아니면 WSL을 켜 주세요
(WSL을 활성화하는 방법은 구글링으로..(chocolatey(윈도우판 apt-get)로는 작동되지 않았습니다.))

준비

bunzip2 패키지가 필요합니다. 다음과 같이 설치해주세요

sudo apt install bzip2
sudo apt install bzip2

저는 이미 설치되어 있기 때문에 위와 같이 표시됩니다.
여러분은 나타나는 질문에 긍정적인 대답을 해 설치를 완료해주세요.

저는 작업을 편하게 하기 위해 아래 사진처럼 경로를 나눴어요.

 

  • 깨짐 - 손상된 원본 압축 파일
  • 복구 - 복구하기 위해 블록 단위로 쪼갠 압축파일
  • 완료 - 복구가 완료된 압축 파일

을 담을 생각입니다.

1. 손상된 파일 분할

cd 명령어로 원하는 디렉토리로 이동한 다음 아래 명령을 사용해 손상된 bz2 파일을 블록 단위로 쪼갭니다.

bzip2recover <파일 이름>
bzip2recover Hello.tar.bz2

(블록의 크기는 사용된 압축 옵션에 따라 100KB... 200KB... 또는 900KB가 될 수 있습니다. 기본값은 900KB입니다)

...모든 블록이 기록되었으면 다음과 같이 저장됩니다.

(용량이 큰 원본 파일은 치워버립시다)

2. 손상된 블록 검색

이제 손상된 블록을 찾아 삭제하거나 수리해야 합니다.

각각의 압축 파일을 모두 테스트하기 위해 아래 명령어를 사용하세요.

for i in *.bz2; do bzip2 -tvf $i >> result.log 2>&1; done
for i in *.bz2; do bzip2 -tvf $i >> result.log 2>&1; done

아무런 응답 없이 잠시 동안 멈춰 있으면 정상입니다.(저는 3분 정도 걸린 것 같네요)

테스트 결과는 같은 폴더의 result.log에 저장됩니다.

메모장으로 result.log 파일을 열어 보았습니다.

모든 파일이 정상이지만(파일이 예기치 않게 끝나는 오류는 무시해도 좋습니다)

단 하나의 파일에서 CRC 체크섬 오류가 발생했네요.

grep 명령으로도 확인할 수 있습니다.

grep -i CRC result.log
grep -i CRC result.log

저는 2581번째 블록이 손상된 모양이에요.

 

3. 손상된 블록 삭제

사용한 로그와 손상된소중한 블록을 삭제합니다. 다른 블록이 아주 많고 해당 블록의 크기가 작다면 손실되는 데이터는 그리 많지 않을 겁니다.

rm result.log
rm rec<손상된 블록>.tar.bz2
rm result.log
rm rec02581Hello.tar.bz2 

또는 파일 탐색기에서 삭제해도 됩니다.

 

4. 손상된 인접 파일 헤더 복원

이제 나머지 파일들의 bz2 압축을 해제해야 합니다.

아까 만든 3개의 폴더 옆에 복구2라는 이름으로 폴더를 하나 더 만들었어요.

실수로 위에서 만드는 걸 까먹어서...

그리고 다음 명령을 입력합니다.

for i in *.bz2; do bzip2 -dcvf $i > ./../복구2/$i.tar; done
for i in *.bz2; do bzip2 -dcvf $i > ./../복구2/$i.tar; done

압축이 풀린 파일 중 아까 손상된 파일 주변에서 가장 가까운 헤더의 시작점과 끝점을 찾아야 합니다

그리고 그 둘을 부드럽게 이어줘야 합니다.

rec02577.tar - 가장 인접한 선행 헤더(./Hello.tar/pictures/easter/pic01.jpg)
rec02578.tar
rec02579.tar
rec02580.tar
rec02581.tar <- 손상된 블록
rec02582.tar
rec02583.tar - 가장 인접한 후행 헤더(./Hello.tar/pictures/easter/pic02.jpg)

블록들에는 위와 같이 헤더가 있고 헤더 사이에는 파일의 내용이 들어 있습니다

위의 블록을 예시로 들자면 pic01.jpg 파일이 손상된 것이겠죠

그 파일의 헤더와 함께 그 파일을 제거하고 서로 이어주면 되겠습니다. 

HEX에디터가 필요합니다.

선행 헤더를 찾기 위해 앞쪽 파일을 차례대로 짚어가며 HEX 에디터로 열어서 헤더를 찾으면 됩니다.

저 같은 경우는 2580...2579...2578.. 등으로 내려가며 파일을 열어야겠죠

 

Ctrl+F 를 반복한 결과 2481번 블록까지 내려가서야 찾았습니다. 용량이 매우 큰 파일이 깨진 모양이에요. 사진 한장 정도라면 보통 한두블록 뒤에 있기에 저는 특수한 케이스라고 할 수 있겠네요.

그 위로는 2743블록에 헤더가 있었습니다. 찾는데 정말 고생했어요. 예전에 누가 루비로 헤더 찾는 프로그램을 만들었던 것 같은데 아무리 찾아도 나오지 않아 그냥 수동으로 찾았습니다. 알고 계신 분은 댓글 부탁드려요.

이제 2481~2743블록 사이의 내용이 깨진 걸 알았으니 그 사이를 지워야 합니다.

헤더의 파일/폴더명은 압축된 내용에 따라 다르겠죠. 제 경우에는 2481번 블록의 MTK_APSoC~ 부터 2743번 블록의 MTK_APSoC~ 바로 직전까지의 모든 내용을 삭제하면 됩니다.(파일 용량이 달라져도 됩니다.)

그리고 수정한 두 블록 사이에 있는 파일(2482~2742)들은 그냥 삭제하면 됩니다.

5. 정상적인 파일 합치기

거의 다 왔어요 조금만 힘내세요! 

남은 파일은 모두 정상 파일이기 때문에 합쳐서 하나의 파일로 만들어야 합니다.

다음 명령어를 참고하세요

cat rec*.tar > ../완료/recovered.tar
cat rec*.tar > ../완료/recovered.tar

끝났습니다 수고하셨습니다.

 

이제 해당 파일은 정상적으로 열리고 아까 예시에서의 사진 한 장(저는 아주 큰 파일이었지만..)을 제외한 나머지 파일을 압축 해제하실 수 있습니다.

tar -xvf recovered.tar
tar -xvf recovered.tar

이 가이드가 도움이 되셨길 바랍니다.

 

 

이 원문을 참조해서 작성되었습니다.  rhinomite님께 감사드립니다 : https://www.linuxquestions.org/questions/linux-general-1/help-need-to-recover-corrupt-bzip2-files-289800/

 

Help! Need to recover corrupt bzip2 files..

Linux - General This Linux forum is for general Linux questions and discussion. If it is Linux Related and doesn't seem to fit in any other forum then this is the place. Notices Welcome to LinuxQuestions.org, a friendly and active Linux Community. You are

www.linuxquestions.org