선택적 오프셋을 사용하여 블록 장치에서 0이 아닌 첫 번째 바이트를 찾는 방법은 무엇입니까?

선택적 오프셋을 사용하여 블록 장치에서 0이 아닌 첫 번째 바이트를 찾는 방법은 무엇입니까?

offset 을 사용하여 인쇄하는 블록 장치(선택적 오프셋에서 시작)에서 0이 아닌 첫 번째 바이트를 찾으려고 하는데 dd멈췄습니다. 이 작업을 수행하는 데 더 좋은 도구가 dd있을 것이라고 생각하기 때문에 제목에 언급 하지 않았지만 이것이 좋은 시작이 될 것이라고 dd생각했습니다 . dd내 목표를 달성하는 데 더 적합한 도구 및/또는 더 효율적인 방법을 알고 계시다면 그것도 좋을 것입니다.

dd그동안 bash를 사용하여 지금까지 진행한 과정을 보여드리겠습니다.

#!/bin/bash

# infile is just a temporary test file for now, which will be replaced with /dev/sdb, for instance
infile=test.txt
offset=0

while true; do
  byte=`dd status='none' bs=1 count=1 if="$infile" skip=$offset`
  ret=$?

  # the following doesn't appear to work
  # ret is always 0, even when the end of file/device is reached
  # how do I correctly determine if dd has reached the end of file/device?
  if [ $ret -gt 0 ]; then
    echo 'error, or end of file reached'
    break
  fi

  # I don't know how to correctly determine if the byte is non-zero
  # how do I determine if the read byte is non-zero?
  if [ $byte ???? ]; then
    echo "non-zero byte found at $offset"
    break
  fi

  ((++offset))
done


보시다시피, 해결 방법을 모르는 두 가지 문제에 직면했습니다
. 파일/장치의 끝에 도달하면 어떻게 반복합니까 while? 제공된 종료 코드는 이지만 0이 아닌 종료 코드를 예상했습니다. b. stdout에서 읽고 반환된 바이트가 0이 아닌지 평가하는 방법은 무엇입니까? Bash에서도 바이트에 특별한 주의를 기울여야 한다는 내용을 어딘가에서 읽은 것 같습니다. 하지만 이것이 이 경우에 적합한지는 확실하지 않습니다.breakdddd0
dd\0

진행 방법에 대한 몇 가지 팁이나 목표 달성을 위한 제안 및 대안을 제공해 주실 수 있나요?

답변1

다음을 사용하여 이 작업을 수행할 수 있습니다.cmp,비교하다 /dev/zero:

cmp /path/to/block-device /dev/zero

cmp0이 아닌 첫 번째 바이트의 오프셋을 제공합니다.

바이트를 건너뛰려면 GNU 옵션을 사용할 수 있고 cmp, -iGNU를 사용하지 않는 경우 다음을 cmp사용하여 적절한 데이터를 제공할 수 있습니다 dd.

cmp -i 100 /path/to/block-device /dev/zero
dd if=/path/to/block-device bs=1 skip=100 | cmp - /dev/zero

이는 블록 장치뿐만 아니라 모든 파일에 적용됩니다.

답변2

스티븐 키트의 답변이것을 다소 무의미하게 만들지만(더 깨끗하고 훨씬 더 빠릅니다) 다른 옵션은 장치의 내용을 한 줄에 한 바이트씩 (16진수) 덤프하고 파이프하는 것입니다. 인쇄 프로그램으로 전송되지 않고 인쇄 프로그램으로 전송되며 00발견되자마자 종료됩니다.

od -Ad -w1 -tx1 /dev/device | awk '$2 && $2 != "00" { print $1 + 1; exit }'

od옵션 -j을 사용하면 건너뛸 바이트 수(입력 시작 부분)를 선택할 수 있습니다.

더 빠른 변경(덕분에피터 코르데스' 주석)에는 추가 입력이 필요합니다.

od -Ad -tx1 | awk '
  {
    for (i=2; i<=NF; i++)
      if ($i != "00") {
        print ($1 + i -1)
        exit
      }
  }'

데이터를 기본 형식으로 출력 하려면 od행 주소에 해당 행의 발생 항목을 추가하여 0이 아닌 첫 번째 바이트의 오프셋을 계산해야 합니다.

관련 정보