パイプラインの条件付きロジックと変数は、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。 2番目のコマンドはdd最初ですdd

2番目は、dd呼び出しで読み取ったデータを見ることができないことに注意してくださいhead!返品、一部 head実装は要求されたデータよりも多くのデータを読み取ることができ、これにより、2番目の実装ddでは少なすぎるデータが表示される可能性があります。 GNU head(ここで使用しているもの)はこの作業をかなりうまくやっているようです。

関連情報