Pipe

管道中的條件邏輯和變數確定 dd 跳過的值

  • June 5, 2020

我正在使用 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 和計算的 skip 值倒帶並恢復整個文件。這是因為似乎沒有任何可靠的方法可以從文件的開頭就地刪除字節(不像結尾,我們有截斷)

考慮以下未經測試的程式碼:

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(這就是您在這裡使用的)在這方面似乎表現良好。

引用自:https://unix.stackexchange.com/questions/591082