0

スクリプトを使用して DDS テープからさまざまなパーティションを読み取りたい
現時点では、次のスクリプトを使用しています

TAPE=/dev/nst0         
BLOCK_SIZE=32768        
COUNTER=1
END_OF_DATA=120

while [  $COUNTER -lt $END_OF_DATA ] 
do      
       dd if=$TAPE bs=$BLOCK_SIZE of=file_$COUNTER  
       let COUNTER+=1 
done

ただし、ご覧のとおり、私のスクリプトは最大 120 のパーティションを読み取ることができます。

このコードを変更して、スクリプトがテープのデータの終わりを自動的に認識できるようにするにはどうすればよいですか

ありがとう

4

2 に答える 2

2

レポートとブロック サイズを比較し続けることができます。はい、デバイスを一度だけ開いて、読み続ける必要があります。

TAPE=/dev/nst0 
BLOCK_SIZE=32768
COUNTER=1

while [ "$(dd bs="$BLOCK_SIZE" of="file_$COUNTER" 2>&1 count=1 | awk '/bytes/ { print $1 }')" -eq "$BLOCK_SIZE" ]; do
    let ++COUNTER
done < "$TAPE"

スクリプトはファイルでテストされます。

最後に読み取ったバイト数が 0 の場合は、最後のファイルを削除することもできます。

while
    BYTES_READ=$(dd bs="$BLOCK_SIZE" of="file_$COUNTER" 2>&1 count=1 | awk '/bytes/ { print $1 }')
    [ "$BYTES_READ" -eq "$BLOCK_SIZE" ]
do
    let ++COUNTER
done < "$TAPE"

[ "$BYTES_READ" -eq 0 ] && rm -f "file_$COUNTER"

テープの処理中にメッセージを送信したい場合は、リダイレクトを使用して別のファイル記述子を使用できます。

TAPE=temp
BLOCK_SIZE=32768
COUNTER=1

while
    FILE="file_$COUNTER"
    echo "Reading $BLOCK_SIZE from $TAPE and writing it to file $FILE."
    BYTES_READ=$(dd bs="$BLOCK_SIZE" of="$FILE" count=1 2>&1 <&4 | awk '/bytes/ { print $1 }')
    echo "$BYTES_READ bytes read."
    [ "$BYTES_READ" -eq "$BLOCK_SIZE" ]
do
    let ++COUNTER
done 4< "$TAPE"

[ "$BYTES_READ" -eq 0 ] && rm -f "$FILE"

出力例:

Reading 32768 from temp and writing it to file file_1.
32768 bytes read.
Reading 32768 from temp and writing it to file file_2.
32768 bytes read.
Reading 32768 from temp and writing it to file file_3.
32768 bytes read.
Reading 32768 from temp and writing it to file file_4.
32768 bytes read.
Reading 32768 from temp and writing it to file file_5.
32268 bytes read.

もう 1 つのオプションは、 を に送信するechoこと/dev/stderrです。

echo "Reading $BLOCK_SIZE from $TAPE and writing it to file $FILE." >&2

また、少し高速化するexecには、サブシェル内で使用して余分なフォークを防ぎます。

BYTES_READ=$(exec dd ...)
于 2014-07-29T08:27:57.020 に答える
1

コメントで言ったように、私はこの問題にあまり精通していませんが、dd各パーティションの最後で停止する」ので、読むものがなくなるまで単純に読んでみませんか?

TAPE=/dev/nst0         
BLOCK_SIZE=32768        
COUNTER=1

while true 
do      
       dd if=$TAPE bs=$BLOCK_SIZE of=file_$COUNTER

       if [ \! -s file_$COUNTER ]
       then
               # clean-up empty file and exit the loop
               rm file_$COUNTER
               break
       fi
       let COUNTER+=1 
done

(未テスト)

于 2014-07-29T11:26:41.553 に答える