대용량 바이너리 파일을 컨텍스트 모드에 따라 결정된 부분으로 분할

대용량 바이너리 파일을 컨텍스트 모드에 따라 결정된 부분으로 분할

다음과 같은 대용량(2GB) 파일이 있습니다.

^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^
<binary data>
^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^ 
<binary data>
^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^
<binary data>
...

^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^은 구분 기호입니다. 바이너리 세그먼트가 큽니다. 기록 보관소에는 약 50개가 있습니다.

파일의 바이너리 부분을 추출하려고 합니다. 각 바이너리 세그먼트는 자체 파일로 이동해야 합니다.

사용해 보았는데 csplit,

csplit --digits=2 --prefix=out stu.ear '/\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^/'

그러나 다음 출력과 두 개의 out??파일을 받았습니다.

1
2097951144

이를 수행할 수 있는 도구가 있습니까( csplit바이너리를 처리할 수 있는 구현일까요?)

답변1

이를 위해 작은 Python 도구를 작성했습니다.https://github.com/mypalmike/csplitb

csplitb.py --prefix X --suffix Y --number Z XXXXXXXX input-file.extension
엑스= 이름으로 시작하는 출력 파일 이름
= 원하는 출력 파일 확장자
= 출력 파일을 구별하는 데 사용되는 비트 수
XXXXXXXXX= 입력 파일에서 분할할 각 바이너리 파일의 시작 16진수
입력 파일.확장자= 파일 분할 중

예:
csplitb.py --prefix photo --suffix .png --number 4 89504e47 block-file.raw

산출:

photo0000.png
photo0001.png
photo0002.png
.............

답변2

다음이 작동합니다:

      awk '/\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^/{n++}{print >"out" n ".ear" }

답변3

text 가 처음 나타날 때 파일을 분할하도록 csplit에 지시합니다 ^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^. 따라서 자연스럽게 두 부분으로 끝나게 됩니다. 하나는 파일의 첫 번째 바이트(첫 번째 구분 기호 앞에 개행 또는 공백이 있습니까?)를 포함하고 다른 부분은 첫 번째 구분 기호부터 시작하는 모든 것을 포함합니다.

별도의 파일로 분할하려면 조각에서 1을 뺀 횟수만큼 이 패턴을 반복해야 합니다. 이식 가능한 경우 조각화를 계산해야 합니다.

csplit --digits=2 --prefix=out stu.ear '/\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^/'"{$(grep -c '\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^' stu.ear)}"

GNU에는 csplit패턴을 무제한으로 반복할 수 있는 확장 기능이 있습니다.

csplit --digits=2 --prefix=out stu.ear '/\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^/ {*}'

그러나 구분 기호가 출력에 포함되어 있기 때문에 원하는 대로 수행되지 않습니다. 나중에 파일에서 제거할 수 있습니다. 패턴 구분 기호 %대신 파일 끝에 구분 기호를 사용하도록 배열하는 것이 더 쉽습니다 . 그러나 csplit은 귀엽지만 사용 사례가 매우 좁고 귀하의 사례가 이에 적합하지 않다는 사실을 받아들이는 것이 좋습니다. 보다 적절한 도구를 사용하세요/csplit … '%\^\%\%-=-=-=-=-=-=-=-=-=-=-=-=-=-\%\%\^% {*}'awk와 같은.

관련 정보