管道中的条件逻辑和变量确定 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(这就是你在这里使用的)在这方面似乎表现得很好。

相关内容