1

ループ内でddを使用して、バイナリ ファイルmyfileのバイトをある特定の位置から別の位置に置き換えることは可能ですか、それとも別のコマンドを使用する方が快適ですか?

アイデアは、位置position2のブロックBを、ループ内の位置1 のブロックAに置き換えることです。

疑似コード

  @ l = 0

  while (l <= bytelength of myfile)
      copy myfile (from position1 to A+position1)  myfile from (position2 to B+position2)
      @ position1 = position1+steplength
      @ position2 = position2+steplength
      @ l = l+steplength

  end
4

1 に答える 1

0

テキストファイル内の次のコード行は、あなたが求めていること(私が思うに)をほぼ実行します。ある場所から別の場所にファイルをコピーしますが、ある場所のバイトブロックを別の場所のブロックに置き換えます。ddリクエストに応じて使用します。ただし、別の出力ファイルが作成されます。これは、「入力」ブロックが「置換」ブロックの前または後に発生するかに関係なく、競合がないことを確認するために必要です。A と B の間の距離が置換されるブロックのサイズよりも小さい場合は何もしないことに注意してください。これによりオーバーラップが発生し、オーバーラップ領域のバイトを「ブロックの終わり」にするかどうかは明確ではありません。 A」または「A のコピーの開始」。

これを というファイルに保存し、blockcpy.shパーミッションを include に変更しますexecute(例: chmod 755 blockcpy.sh)。で実行します

./blockcpy.sh inputFile outputFile from to length

"from" および "to" オフセットの基数は 0 であることに注意してください。したがって、ファイルの先頭から始まるバイトをコピーする場合、from引数は 0 です。

ファイルの内容は次のとおりです。

#!/bin/bash
# blockcpy file1 file2 from to length
# copy contents of file1 to file2
# replacing a block of bytes at "to" with block at "from"
# length of replaced block is "length"
blockdif=$(($3 - $4))
absdif=${blockdif#-}
#echo 'block dif: ' $blockdif '; abs dif: ' $absdif
if [ $absdif -ge $5 ]
  then
    # copy bytes up to "to":
    dd if=$1 of=$2 bs=$4 count=1 status=noxfer 2>0
    # copy "length" bytes from "from":
    dd bs=1 if=$1 skip=$3 count=$5 status=noxfer 2>0 >> $2
    # copy the rest of the file:
    rest=$((`cat $1 | wc -c` - $4 - $5))
    skip=$(($4 + $5))
    dd bs=1 if=$1 skip=$skip count=$rest status=noxfer 2>0 >> $2
    echo 'file "'$2'" created successfully!'
  else
    echo 'blocks A and B overlap!'
fi

" 2>0'nix マジック" は stderr からの出力を抑制しますが、それ以外の場合は (タイプ: " 16+0 records in") 出力に表示されます。

于 2013-04-03T16:44:35.530 に答える