テープからデータストリームを返すために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
。 2番目のコマンドはdd
最初ですdd
。
2番目は、dd
呼び出しで読み取ったデータを見ることができないことに注意してくださいhead
!返品、一部 head
実装は要求されたデータよりも多くのデータを読み取ることができ、これにより、2番目の実装dd
では少なすぎるデータが表示される可能性があります。 GNU head
(ここで使用しているもの)はこの作業をかなりうまくやっているようです。