Pipe
管道中的條件邏輯和變數確定 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 和計算的 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
實現看到的數據太少。GNUhead
(這就是您在這裡使用的)在這方面似乎表現良好。