파이프라인의 조건부 논리와 변수는 dd가 건너뛰는 값을 결정합니다.

파이프라인의 조건부 논리와 변수는 dd가 건너뛰는 값을 결정합니다.

테이프에서 데이터 스트림을 반환하기 위해 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(여기서 사용하고 있는 것)는 이 작업을 꽤 잘 수행하는 것 같습니다.

관련 정보