dd vs cat - ddは今日でもまだ意味がありますか?

dd vs cat - ddは今日でもまだ意味がありますか?

私は最近私たちがcatできるだけ多くを使用できることに気づきました。dd実際にはそれよりも優れていますdd

私はこれがddパフォーマンスだけでなく正確さのために実際にブロックサイズが重要なテープ操作に役立つことを知っています。しかし、最近dd私たちができる状況catとできない状況がありますか? (ここでは20%未満の性能差は重要ではないと思います。)

具体的な例が良いと思います!

答え1

ビューには、ddIBM オペレーティング・システムのツールとして、外観 (パラメーターの受け渡し) を維持し、ほとんど使用されないいくつかの機能 (例えば、EBCDIC から ASCII への変換またはバイト順の逆転...最近では一般的ではない) を実行します。

一度考える同じディスクに大きなデータブロックをコピーする方がdd高速ですが(バッファリングをより効率的に使用するため)本当ではない、少なくとも今日のLinuxシステムではそうです。

読み取りが実際にブロック単位で行われるテープを処理する場合、いくつかのオプションが役に立つと思いますdd(テープドライバはディスクドライバのように記憶媒体のブロックを隠すことはありません)。しかし、具体的な内容はわかりません。

dd他のPOSIXツールでは(簡単に)実行できないことの1つは最初のNバイトを取得ストリーム。これを行うには多くのシステムを使用できますが、head -c 42一般的head -cですがPOSIXには存在しません(そして現在OpenBSDなどのプラットフォームでは使用できません)。 (tail -cPOSIXです。)head -c存在していても、ソースからあまりにも多くのバイトを読み取ることができます(内部的にはstdioバッファリングを使用するため)。これは特別なファイルから読むだけで問題になるか、影響を与える可能性があります。残りのデータは、他のプロセスが読み取る必要があるときにパイプから読み取ることです。 (現在、GNU coreutilsは正確な読み取り計算を使用しますhead -cが、FreeBSDとNetBSDはstdioを使用します。)

より一般的には、ddUnixツールの中でユニークなネイティブファイルAPIへのインターフェースを提供します。dd上書きまたは切り取り1つの文書どの時点でもまたは探すファイルから。 (これはddユニークな能力と重要な能力です。奇妙なことに、dd他のツールが実行できることで最もよく知られています。)

  • ほとんどのUnixツールは出力ファイルを上書きし、内容を消去して最初から始めます。これは、>シェルでリダイレクトを使用する場合にも発生します。

  • >>シェルでリダイレクトを使用するかtee -a

  • すべてのデータを削除してファイルを短縮したい場合特定の時点以降、これはデフォルトのカーネルとC APIで次のように提供されます。truncate関数ですが、POSIXコマンドラインツールでは公開されません。とは別にdd:

      dd if=/dev/null of=/file/to/truncate seek=1 bs=123456  # truncate file to 123456 bytes
    

    (しかし、多くの現代システムはtruncateユーティリティを提供しています。)

  • ファイルの中央にあるデータを上書きするには、次の方法でデフォルトのAPIでこれを実行できます。開く切り捨てなしでファイルに書き込む(および呼び出しlseek必要に応じて目的の場所に移動します)、dd切り取りまたは追加せずにファイルのみを開く探すシェルから(より複雑な例)。

      # zero out the second kB block in the file (i.e. bytes 1024 to 2047)
      dd if=/dev/zero of=/path/to/file bs=1024 seek=1 count=1 conv=notrunc
    

だから…システムツールとしてはddほとんど役に立ちません。でも危険。テキスト(またはバイナリファイル)処理ツールとして非常に価値があります!

答え2

まだddを使用して作成できると述べた人はいません。スパースファイルしかし、truncate同じ目的で使用することもできます。

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

利点は、最初は単一のディスクスペースブロックのみを使用し、その後は必要なときにのみ拡張されることです(ext4形式の10 GBファイルは私のシステムで291 MBを消費します)。du実際に使用されているディスク容量を確認するために使用されます。lsファイルが大きくなる可能性のある最大サイズのみが報告されます。

答え3

このddコマンドには、catが受け入れられない多くのオプションが含まれています。おそらくcatはあなたのユースケースで実行可能な代替品ですが、dd代替品ではありません。

たとえば、dd全体ではなく一部だけをコピーする場合があります。デバイスの既知の場所に基づいて、isoイメージまたはハードドライブパーティションテーブルの中央からいくつかのビットを削除したい場合があります。ddこれらの操作を許可する開始、停止、および数量オプションを指定できます。

これらのオプションはddきめ細かいデータ操作に不可欠ですが、cat*はファイルオブジェクト、デバイス、またはストリーム全体でのみ機能できます。

*Gillesがコメントで指摘したように、cat他のツールと組み合わせて特定のオブジェクトの一部を分離しながらオブジェクトcat全体を操作できます。

答え4

ddハードドライブやその他のストレージデバイスのブートセクタをバックアップし(dd if=/dev/sda of=boot_sector.bin bs=512 count=1)、後で書き換えるのにdd if=boot_sector.bin of=/dev/sda役立ちます()。暗号化されたボリュームのヘッダーをバックアップするのにも役立ちます。

cat多分いくつかの変形を加えて完成するかもしれませんが、私はその部分を書き直すことを信じていません。cat特定のバイト数だけを読み書きすることは困難です。

関連情報