私は最近、cat
をdd
と同じくらい使用できることに気づき、それは 実際にはdd
より速い
dd
は、パフォーマンスだけでなく、ブロックサイズが正確に重要であるテープを処理するのに役立ちました。しかし、最近では、dd
がcat
でできないことはありますか? (ここでは、20%未満のパフォーマンスの違いは無関係と見なします。)
具体的な例はいいですね!
dd
コマンドには、catが対応できない多くのオプションが含まれています。多分あなたの使用例では猫は実行可能な代用品ですが、それはddの代わりではありません。
1つの例は、dd
を使用して、全体ではなく一部のコピーを作成することです。おそらく、デバイス上の既知の場所に基づいて、ISOイメージまたはパーティションテーブルの中央から一部のビットをハードドライブから取り除きます。 dd
を使用すると、これらのアクションを許可する開始、停止、数量のオプションを指定できます。
dd
*のこれらのオプションは、きめ細かなデータ操作に不可欠ですが、cat
*は、ファイルオブジェクト、デバイス、またはストリーム全体でのみ操作できます。
* Gillesのコメントで述べたように、cat
を他のツールと組み合わせて何かの部分を分離することは可能ですが、cat
は引き続きオブジェクト全体に対して機能します。
truncate
を同じ目的で使用することもできますが、ddを使用して sparse files を作成できると誰も述べていません。
dd if=/dev/zero of=sparse-file bs=1 count=1 seek=10GB
これはほとんど瞬時であり、たとえばループバックファイルとして使用できる任意の大きなファイルを作成します。
loop=`losetup --show -f sparse-file`
mkfs.ext4 $loop
mkdir myloop
mount $loop myloop
良い点は、最初はディスクスペースの単一のブロックのみを使用し、その後は必要に応じてのみ拡張することです(10 GBファイルのext4フォーマットはシステムで291 MBを消費します)。実際に使用されているディスク容量を確認するには、du
を使用します-ls
は、ファイルが大きくなる可能性がある最大サイズのみを報告します。
ハードドライブの特定のセグメントを何かで上書きすることは一般的な例です。たとえば、次のコマンドを使用してMBRを削除することができます。
dd if=/dev/zero of=/dev/sda bs=446 count=1
また、それを使用して空のファイルを作成することもできます(ループディスクイメージなど)。
dd if=/dev/zero of=10mb.file bs=1024k count=10
dd
は、ハードドライブまたはその他のストレージデバイスのブートセクター(dd if=/dev/sda of=boot_sector.bin bs=512 count=1
)、その後、それを書き直します(dd if=boot_sector.bin of=/dev/sda
)。暗号化されたボリュームのヘッダーをバックアップする場合にも同様に役立ちます。
cat
はそれを行うことにねじれる可能性があるかもしれませんが、私は書き換え部分でそれを信頼しません。 cat
が特定のバイト数のみを読み書きできるようにすることは困難です。
私は最近、Linuxの歴史の中で初めて、数百GBのパーティションを複製する原因がありました(c.f cp -ar
またはrsync
は、何度も役立ちました)。もちろん、私はdd
'cosを使用しました。誰もがそれを使用していることを誰もが知っているので...パフォーマンスにびっくりしました。少しグーグルするとすぐに ddrescue
になりました。これは数回使用したことがあり、非常によく機能します(ddよりもはるかに高速)。
ここに私が長年かけて思い付いたいくつかのddトリックがあります。
EOF/^ D/^ Fが検出されない場合は、ddを使用してテキストファイルをホストに転送できます。指定されたバイト数の後で自動的に読み取りを停止するため。
私は昨年、リモートホストでtty以外のシェルを取得することができ、ファイルを転送する必要があるセキュリティ演習中に、これを最近使用しました。
実際、base64エンコードし、低速だが信頼性の高い純粋なbash base64デコードスクリプトを使用して、いくつかのバイナリファイルを作成しました。
dd of=textfile.txt bs=1 count=<size_of_data_in_paste_buffer>
超クールなトリックは、ddの実行中にUSR1シグナルを送信すると、現在のステータス(読み取りバイト数、1秒あたりのバイト数)を発行するということです。
Stdoutを介してデータを出力するすべてのプログラムの純粋なbash進行フィルターとして機能するようにこれを書きました。 (注:ほとんどすべてがstdoutを介してデータを放出します-放出しないプログラムの場合、/ dev/stdoutをファイル名として使用すると、彼らがあなたにバーフしない場合はごまかすことができます。ただし、基本的には、Xを取得するたびにバイト数、ハッシュマークの印刷(ハッシュモードをオンにしたときの古いFTPなど)
(注)プログレスファイルは不完全です。これは主に概念実証でした。やり直した場合は、変数を使用します。
dd bs=$BLKSZ of=${TMPFILE} 2>&1 \
| grep --line-buffered -E '[[:digit:]]* bytes' \
| awk '{ print $1 }' >> ${PROGRESS} &
while [[ $(pidof dd) -gt 1 ]]; do
# PROTIP: You can sleep partial seconds
sleep .5
# Force dd to update us on it's progress (which gets
# redirected to $PROGRESS file.
pkill -USR1 dd
local BYTES_THIS_CYCLE=$(tail -1 $PROGRESS)
local XFER_BLKS=$(((BYTES_THIS_CYCLE-BYTES_LAST_CYCLE)/BLKSZ))
if [ $XFER_BLKS -gt 0 ]; then
printf "#%0.s" $(seq 0 $XFER_BLKS)
BYTES_LAST_CYCLE=$BYTES_THIS_CYCLE
fi
done
以下は、匿名のファイルハンドルを介してtar入力を提供することにより、エラーなしで抽出できる署名付きtarファイルを作成できる非常に疑似コードの例です-tmpファイルを使用して部分的なファイルデータを保存することなく。
generate_hash() {
echo "yay!"
}
# Create a tar file, generate a hash, append it to the end
tar -cf log.tar /var/log/* 2>/dev/null
TARFILE_SIZE=$(stat -f "%z" log.tar)
SIGNATURE=$(generate_hash log.tar)
echo $SIGNATURE >>log.tar
# Then, later, extract without getting an error..
tar xvf <(dd if=$OLDPWD/log.tar bs=1 count=${TARFILE_SIZE})
Tl; drは次のとおりです。ddは非常に便利です。そして、これらは私が頭の上で考えることができる3つの例にすぎません。
一部の出力コンテンツをリダイレクトできます。 Sudo
で記述する必要がある場合は、特に便利です。
echo some_content | Sudo dd status=none of=output.txt
Sudo
に加えて、以下と同等です。
echo some_content > output.txt
またはこれに:
echo some_content | Sudo tee output.txt > /dev/null