Dd

dd vs cat - 這些天 dd 仍然相關嗎?

  • January 11, 2022

我最近意識到我們可以使用cat盡可能多的dd,它實際上比dd

我知道這dd對於處理塊大小實際上對正確性很重要的磁帶很有用,而不僅僅是性能。但是,在這些日子裡,是否有一些情況dd可以做一些cat不能做的事情?(在這裡,我認為不到 20% 的性能差異無關緊要。)

具體的例子會很好!

在外觀上,dd它是一個來自 IBM 作業系統的工具,它保留了它的外來外觀(它的參數傳遞),它執行一些非常少用的功能(例如 EBCDIC 到 ASCII 轉換或字節序反轉……現在不是常見的需要)。

曾經認為dd同一個磁碟上複製大塊數據會更快(由於更有效地使用緩衝),但事實並非如此,至少在今天的 Linux 系統上是這樣。

我認為dd’s 的某些選項在處理磁帶時很有用,其中讀取實際上是按塊執行的(磁帶驅動程序不會像磁碟驅動程序那樣隱藏儲存介質上的塊)。但我不知道具體情況。

dd任何其他 POSIX 工具都無法(輕鬆)完成的一件事是獲取流的前 N ​​個字節。許多系統可以用 來做到這一點head -c 42,但是head -c,雖然很常見,但不在 POSIX 中(並且今天在例如 OpenBSD 上不可用)。(tail -c是 POSIX。)此外,即使head -c存在,它也可能從源讀取太多字節(因為它在內部使用 stdio 緩衝),如果您正在從僅讀取有效果的特殊文件中讀取,這是一個問題,或者當其餘數據應留給另一個程序讀取時,來自管道。(目前的 GNU coreutils 使用 讀取準確的計數head -c,但 FreeBSD 和 NetBSD 使用 stdio。)

更一般地說,dd它為底層文件 API 提供了一個在 Unix 工具中獨一無二的介面:只能dd任何點****覆蓋或截斷文件或在文件中查找。(這是的獨特能力,而且很大;奇怪的是,它以其他工具可以做的事情而聞名。)dd``dd

  • 大多數 Unix 工具會覆蓋其輸出文件,即刪除其內容並從頭開始。當您>在 shell 中使用重定向時也會發生這種情況。
  • 您可以使用>>shell 中的重定向或使用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幾乎沒用,甚至很危險。作為一個文本(或二進製文件)處理工具,它是相當有價值的!

引用自:https://unix.stackexchange.com/questions/12532