테이프에서 데이터 스트림을 반환하기 위해 dd를 사용하고 있습니다. 필요한 바이트 범위를 추출하는 파이프를 통해 보내고 싶습니다. 초기 바이트에 문자열이 있는지 확인해야 하며 해당 값에 따라 바이트 범위가 달라집니다. 이 같은...
dd if=/dev/tape/st0 bs=512K | { var=1; if [[ $(head -c13) == "././@LongLink" ]]; then var=3; } | dd of=extracted_file.bin skip=$(512*$var) iflag=skip_bytes
그러나 변수가 정의된 파이프 세그먼트 이후에는 변수를 참조할 수 없다는 것을 알고 있습니다.
편집하다
kusalananda의 의견에 따르면 실용적인 목표일 수 있는 것을 달성하는 가장 좋은 방법은 테이프에서 개별 블록을 복구하고 필요한 정보를 얻은 다음 dd와 건너뛴 계산 값을 사용하여 전체를 되감고 복구하는 것이라고 생각합니다. 파일. 이는 파일의 시작 부분에서 바이트를 제거하는 신뢰할 수 있는 방법이 없는 것 같기 때문입니다(끝과 달리 바이트를 자르는 경우).
답변1
테스트되지 않은 다음 코드를 고려해보세요.
dd if=/dev/tape/st0 bs=512K |
{
skip=512
if [[ $( head -c 13 ) == "././@LongLink" ]]; then
skip=$(( skip*3 ))
fi
dd of=extracted_file.bin skip="$skip" iflag=skip_bytes
}
그러면 초기 데이터의 데이터가 dd
복합 명령으로 전달됩니다. 복합 명령은 skip
어떤 숫자로 설정하고(변수 이름을 바꿨습니다) 을 호출합니다 dd
. 두 번째 명령은 dd
초기 dd
.
두 번째 것은 dd
호출로 읽은 데이터를 볼 수 없다는 점에 유의하십시오 head
! 반품,일부 head
구현에서는 요청한 것보다 더 많은 데이터를 읽을 수 있으며, 이로 인해 두 번째 dd
구현에서는 너무 적은 데이터가 표시될 수 있습니다. GNU head
(여기서 사용하고 있는 것)는 이 작업을 꽤 잘 수행하는 것 같습니다.