Dd (Unix)

用法

dd的命令列語句與其他的Unix程式不同，因為它的命令列選項格式為选项=值，而不是更標準的--选项 值或-选项=值。dd預設從標準輸入中讀取，並寫入到標準輸出中，但可以用選項if（input file，輸入檔案）和of（output file，輸出檔案）改變。
由於作業系統的不同，用法會有出入。另外，dd的一些特定功能取決於電腦系統的能力，例如直接存取記憶體。向執行中的dd行程傳送SIGINFO訊號（Linux上為USR1）可以使它將I/O統計資訊列印到標準錯誤一次，然後繼續複製（注意在OS X上，訊號可能導致行程終止）。dd可以從鍵盤中讀取標準輸入。到達檔案結尾時，dd將會退出。訊號和EOF是由軟體決定。例如，移植到Windows的Unix工具使用不同的EOF：Cygwin使用<ctrl-d> （通常的Unix EOF），而MKS工具箱使用<ctrl-z>（通常的Windows EOF）。
正如Unix哲學一樣，dd只做好一件事（並被認為做得「好」）。與複雜的和高度抽象的實用程式不同，除了為不同的選項做底層決定，dd沒有其它的演算法。一般在每一次執行時，會改變dd的選項以分步處理一個電腦問題。

輸出訊息

Linux上GNU coreutils提供的變種沒有描述執行結束時，dd輸出到標準輸出訊息的格式。然而，其他的實現描述了它，例如BSD上的。
「記錄讀入」和「記錄寫出」行顯示了已完整傳輸的塊數+不完整的塊數，例如物理媒介以不完整的塊結尾，或是一個物理錯誤使得一個完整的塊無法被讀取。

塊大小

塊是衡量一次讀取、寫入和轉換位元組的單位。命令列選項可以為輸入/讀取（ibs）和輸出/寫入（obs）指定一個不同的塊大小，儘管塊大小（bs）選項會覆蓋ibs和obs選項。輸入和輸出的預設塊大小為512位元組（傳統的磁碟塊及POSIX規定的「塊」大小）複製的count選項、讀取的skip選項和寫入的seek選項都是以塊為單位。轉換操作也受「轉換塊大小」（cbs）影響。
在dd的一些用途中，塊大小可能會影響表現。例如，當轉換硬碟中資料時，較小的塊大小通常會導致更多的位元組被轉換。發出許多小塊的讀取是一種開銷的浪費，且可能會對執行效能有負面影響。較大的塊大小可能會提高複製速度。但是，由於要複製的位元組量是由bs×count給出的，因此不可能在一次dd命令中複製素數個位元組，除非使用兩個糟糕選項之一：bs=N count=1（消耗記憶體）或bs=1 count=N（大量讀請求開銷）。替代程式（見下文）允許指定位元組，而不是塊。在用作網路傳輸時，根據使用的網路協定，塊大小可能會與包大小衝突。
提供給塊大小的值會被解釋成十進位整數，也可以加入字尾指定倍數。字尾w表示2倍，b表示512倍，k表示1024倍，M表示1024 × 1024倍，G表示1024 × 1024 × 1024倍，等等。另外，在塊大小和計數參數中，一些實現也可以使用x表示乘運算。
例如，塊大小bs=2x80x18b表示2 × 80 × 18 × 512 = 1474560位元組，也就是一張1440 KiB軟碟的確切大小。

用途

dd命令可用於各種用途。

備份和恢復主開機紀錄

可以修復主開機紀錄。主開機紀錄可以轉移到檔案，或從中轉移出來。
要複製軟碟的前兩個磁區：
dd if=/dev/fd0 of=MBRboot.img bs=512 count=2
要建立整個x86主開機紀錄的鏡像（包括MS-DOS分割區表和MBR魔法位元組）：
dd if=/dev/sda of=MBR.img bs=512 count=1
要建立僅含主開機紀錄啟動程式碼的鏡像（不包括分割區表和開機所需的魔法位元組）：
dd if=/dev/sda of=MBR_boot.img bs=446 count=1

資料修改

dd可以原地修改資料。
用空位元組覆蓋檔案的前512個位元組：
dd if=/dev/zero of=path/to/file bs=512 count=1 conv=notrunc
轉換選項notrunc意味著不縮減輸出檔案，也就是說，如果輸出檔案已經存在，只改變指定的位元組，然後退出，並保留輸出檔案的剩餘部分。沒有這個選項，dd將建立一個512位元組長的檔案。
在不同的分割區中複製磁碟分割區到磁碟映像檔案中：
dd if=/dev/sdb2 of=partition.image bs=4096 conv=noerror

磁碟擦除

出於安全方面的考慮，有時需要擦除丟棄的磁碟。
檢查驅動器上是否有資料，並將其輸出到標準輸出：
dd if=/dev/sda
用零擦除磁碟：
dd if=/dev/zero of=/dev/sda bs=4k
相較於上面資料修改的例子，不需要使用轉換選項notrunc，因為當dd的輸出檔案為塊裝置時，它沒有效果。
bs=4k選項使dd一次讀取或寫入4千位元組。在現代系統中，由於傳輸容量（如RAID系統），一個更大的塊大小可能更有利。注意用亂數據填充磁碟總是比用零慢的多，因為亂數據必須先由CPU和/或HWRNG生成，且不同的設計有不同的效能特點。（後面PRNG的/dev/urandom可能比libc中的要慢。）在大多數較現代的磁碟中，用零擦除會使其中的資料永久遺失。
用零擦除磁碟會使它的資料無法被軟體恢復。然而資料仍可能用特殊的實驗室技術恢復。
shred程式提供了完成相同任務的替代方法，最後，目前許多Linux發行版還提供了一個精心製作的工具wipe（做得「好」，如上面的Unix哲學），提供了更多方法擦除。

資料恢復

1984年，GNU dd開啟了開源軟體（OSS）恢復資料、檔案、驅動器和分割區的歷史。dd行程一次處理一個塊，它的演算法只是在使用者介面顯示執行狀態。1999年10月，一個C語言的程式dd_rescue發布了。它的演算法一次能處理兩個塊。但改進dd_rescue的資料恢復演算法、2003年的shell指令碼dd_rhelp作者現在推薦GNU ddrescue。它是一個發布於2004年的C++程式，與大多數的Linux發行版一起發行。在開源軟體中，GNU ddrescue有最先進的塊大小變換演算法。（ddrescue和dd_rescue儘管名字相近，但卻是不同的程式。因為如此，區分更為明確的備用名稱也有使用；使用的名稱有「addrescue」（freecode.com），「gddrescue」（Debian包名）和「gnu_ddrescue」（openSUSE包名）。）
GNU ddrescue既穩定又安全。
另一個開源程式savehd7使用更複雜的演算法，但它需要安裝自己的語言直譯器。

驅動器效能基準測試

對驅動器進行基準測試（通常是單執行緒），使用1024位元組塊分析連續系統讀取和寫入的效能：
dd if=/dev/zero bs=1024 count=1000000 of=file_1GB
dd if=file_1GB of=/dev/null bs=1024

用亂數據生成檔案

使用核心亂數驅動，用100個隨機位元組生成檔案：
dd if=/dev/urandom of=myrandom bs=100 count=1

將檔案轉換為大寫

將檔案轉換為大寫：
dd if=filename of=filename1 conv=ucase

建立任意大小的空檔案

建立1GiB的稀疏檔案，或增加現有檔案的大小：
dd if=/dev/zero of=mytestfile.out bs=1 count=0 seek=1G
（更先進的工具是GNU coreutils中的fallocate或truncate。）

局限

希捷的文件警告說，「一些依賴底層硬碟存取的硬碟工具（如DD）可能不支援48位元邏輯區段位址（LBA），除非進行更新」。使用超過128 GiB的ATA硬碟時需要48位元LBA。然而在Linux中，dd使用核心讀取或寫入原始裝置檔案。2003年釋出的2.4.23版本核心已經實現了對48位元LBA的支援。
有人開玩笑說，dd意為「destroy disk」（破壞硬碟）或「delete data」（刪除資料），因為在對硬碟進行底層操作時，類似顛倒輸入和輸出檔案的一個小錯誤都可能造成部分或全部硬碟資料的遺失。

dcfldd

dcfldd是dd的一個分支，由前美國國防部電腦取證實驗室雇員尼克·哈勃（Nick Harbour）開發的增強版本。與dd相比，dcfldd允許一個以上的輸出檔案，同時支援多種校驗計算方法，還提供了驗證模式以符合檔案，並能顯示操作進度百分比。