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에서도 바이트에 특별한 주의를 기울여야 한다는 내용을 어딘가에서 읽은 것 같습니다. 하지만 이것이 이 경우에 적합한지는 확실하지 않습니다.break
dd
dd
0
dd
\0
진행 방법에 대한 몇 가지 팁이나 목표 달성을 위한 제안 및 대안을 제공해 주실 수 있나요?
답변1
다음을 사용하여 이 작업을 수행할 수 있습니다.cmp
,비교하다 /dev/zero
:
cmp /path/to/block-device /dev/zero
cmp
0이 아닌 첫 번째 바이트의 오프셋을 제공합니다.
바이트를 건너뛰려면 GNU 옵션을 사용할 수 있고 cmp
, -i
GNU를 사용하지 않는 경우 다음을 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이 아닌 첫 번째 바이트의 오프셋을 계산해야 합니다.