파일에서 Zero/Null-Bytes를 제거/제거/잘라내는 방법

파일에서 Zero/Null-Bytes를 제거/제거/잘라내는 방법

주어진 내용: 일반 바이너리 파일과 블록 크기

원하는 출력: 0비트/바이트만 포함하는 모든 블록이 파일에서 제거/제거된 바이너리 파일의 복사본

왜 이렇게 간단한 작업을 수행하는 도구를 찾을 수 없는지 정말 궁금합니다. 작은 스크립트를 작성했는데 성능이 말도 안 돼요. 이를 수행할 수 있는 기존 소프트웨어가 있어야 합니다. 그렇지 않습니까?!

어쩌면 이것을 찾는 문제는 이러한 필요성을 표현하는 데 사용할 수 있는 용어가 너무 많기 때문에 발생하는 것일 수 있습니다.

편집: 당신이 언급한 sed 스레드는 모든 바이트를 대체합니다. 행에 최소한 블록 크기가 많은 경우 0바이트를 대체하고 싶습니다.

매우 크고 매우 희박한 파일(파일 시스템의 희소 파일처럼 희박하지 않음)을 조사하고 이 분석을 위해 관련 없는 부분을 잘라내고 싶습니다.

편집 2: 파일 크기는 10~1000GB 정도입니다. 작은 크기의 경우 느린 자체 도구는 괜찮지만 이렇게 큰 파일의 경우 ...

답변1

bbe" sed바이너리 파일을 위한 유사한 편집기"입니다. 데비안에서는 패키지에 있습니다 bbe.

s/^\0*$//널 바이트로 가득 찬 블록을 식별하고 제거 할 수 있다면 가장 좋습니다 . 내 테스트에서는 정규식과 유사한 표현식이 bbe. \0필요한만큼 (거의) 사용할 수 있습니다 .

s/\0\0…\0\0//

여기서 는 부분 문자열 의 올바른 수를 나타냅니다 \0. 큰 블록 크기를 선택하는 경우 명령줄을 통해 그에 따라 긴 문자열을 전달하는 것이 문제가 될 수 있습니다. 다행히 bbe파일에서 스크립트 읽기를 지원합니다. 다음과 같이 진행하세요:

# The following function uses non-POSIX 'for' loop. Rewrite if necessary.
gen_script() {
   printf 's/'
   for ((i=0;i<"$1";i++)); do
      printf '\\0'
   done
   printf '//\n'
}

# This needs to be a plain decimal number:
blocksize=512

gen_script "$blocksize" > bbe-script
<binary_file_in bbe -b ":$blocksize" -f bbe-script >binary_file_out

문제:

  1. 위의 구현은 gen_script꽤 느리고 대규모의 경우에는 실용적이지 않습니다 blocksize.
  2. 내 테스트에서는 16KiB 블록 보다 큰 bbe경우 오작동했습니다 . 이로 인해 첫 번째 문제가 관련성이 없게 됩니다.blocksize16384
  3. 이 역할 bbe자체도 그다지 빠르지 않은 것 같습니다. "매우 큰 파일"이 얼마나 큰지 모르겠습니다. 내가 너라면 시도해 볼 텐데

    pv binary_file_in | bbe -b ":$blocksize" -f bbe-script >binary_file_out
    

    몇 초 후에 ETA가 허용되는지 알 수 있습니다.

관련 정보