我正在使用 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
(这就是你在这里使用的)在这方面似乎表现得很好。