대형(희소) 파일 A의 0이 아닌 블록을 대형 파일 B로 병합

대형(희소) 파일 A의 0이 아닌 블록을 대형 파일 B로 병합

고장난 하드 드라이브의 부분 디스크 이미지가 두 개 있습니다. 파일 B에는 섹터 읽기가 실패한 공백이 있는 대부분의 디스크가 포함되어 있습니다. 파일 A는 다음과 같이 말한 결과입니다.ddrescue실패한 섹터는 모두 재시도되므로 거의 완전히 공백이 있지만 재읽기에 성공한 일부 섹터가 포함되어 있습니다. 이제 파일 A의 흥미로운 콘텐츠를 다시 파일 B로 병합해야 합니다. 알고리즘은 간단합니다.

while not eof(A):
   read 512 bytes from A
   if any of them are nonzero:
       seek to corresponding offset in B
       write bytes into B

그리고 나할 수 있다이 글을 직접 작성하기 위해 자리에 앉았지만, 이미 작성하고 디버깅한 사람이 있는지 먼저 알고 싶습니다.

(복잡하게도 파일 B와 파일 A는 제한된 공간으로 인해 두 대의 다른 컴퓨터에 있습니다. 이것이 ddrescueB의 공백을 메우려고 말하는 것이 아니라 A는 비교적 쉽게 네트워크를 통해 전송할 수 있다는 것입니다. 드물다.)

답변1

귀하의 알고리즘은 GNU로 구현되었습니다 dd.

dd bs=512 if=A of=B conv=sparse,notrunc

선택한 일부 테스트 파일을 사용하여 이를 미리 확인하십시오. 실수로 File 을 손상시키고 싶지는 않습니다 B. 더 나은 알고리즘은 B해당 위치에도 0이 있는지 확인하는 것이지만 불행히도 이 작업은 dd수행되지 않습니다.

두 대의 서로 다른 컴퓨터에 대해 여러 가지 옵션이 있습니다. 쓰기 탐색을 지원하는 네트워크 파일 시스템을 사용하십시오(모두 지원되는 것은 아님). 다음과 같이 파일을 미리 전송하거나 SSH를 통해 전송하십시오.

dd if=A | ssh -C B-host dd of=B conv=sparse,notrunc
# or the other way around
ssh -C A-host dd if=A | dd of=B conv=sparse,notrunc

ssh -C옵션을 사용하면 압축이 가능합니다. 그렇지 않으면 네트워크를 통해 기가바이트 단위의 0을 전송하게 됩니다.

관련 정보