> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/man1/dd.1.md).

# dd(1)

`dd` — 转换并复制文件

## 名称

`dd`

## 概要

`dd [operands ...]`

## 描述

`dd` 实用程序将标准输入复制到标准输出。输入数据以 512 字节为块进行读取和写入。如果读取的输入不足一块，则将多次读取的输入聚合以形成输出块。完成时，`dd` 会将完整和部分输入输出块的数量以及被截断的输入记录数显示到标准错误输出。

以下操作数可用：

**`bs`**=`n` 同时将输入和输出块大小设置为 `n` 字节，取代 `ibs` 和 `obs` 操作数。如果除 `noerror`、`notrunc` 或 `sync` 之外未指定其他转换值，则每个输入块作为单个块复制到输出，不进行任何短块聚合。

**`cbs`**=`n` 将转换记录大小设置为 `n` 字节。面向记录的转换值需要该转换记录大小。

**`count`**=`n` 仅复制 `n` 个输入块。

**`files`**=`n` 在终止前复制 `n` 个输入文件。该操作数仅在输入设备为磁带时适用。

**`fillchar`**=`c` 在转换模式下填充块，或由于使用 `noerror` 和 `sync` 模式而填充块时，使用指定的 ASCII 字符填充，而不是使用空格或 `NUL`。

**`ibs`**=`n` 将输入块大小设置为 `n` 字节，而非默认的 512。

**`if`**=`file` 从 `file` 而非标准输入读取输入。

**`iflag`**=`value`\[,`value ...`] 其中 `value` 是以下列表中的符号之一。

**`fullblock`** 从输入文件读取时可能无法获得完整的块。当读取返回不足时，继续读取以填满该块。若未指定此标志，`count` 限制的是对输入调用 read(2) 的次数，而非完整复制的块数。不能与 `conv=sync` 同时使用。

**`direct`** 在输入文件上设置 O\_DIRECT 标志，使读取绕过任何本地缓存。

**`iseek`**=`n` 在输入文件上跳过 `n` 个块。等同于 `skip`=`n`。

**`obs`**=`n` 将输出块大小设置为 `n` 字节，而非默认的 512。

**`of`**=`file` 将输出写入 `file` 而非标准输出。除非指定了 `notrunc` 转换值，否则任何常规输出文件都会被截断。如果输出文件的初始部分被跳过（参见 `oseek` 操作数），输出文件将在该点被截断。

**`oflag`**=`value`\[,`value ...`] 其中 `value` 是以下列表中的符号之一。

**`fsync`** 在输出文件上设置 O\_FSYNC 标志，使写入同步。

**`sync`** 在输出文件上设置 O\_SYNC 标志，使写入同步。等同于 `fsync` 值。

**`direct`** 在输出文件上设置 O\_DIRECT 标志，使写入绕过任何本地缓存。

**`oseek`**=`n` 在输出文件上跳过 `n` 个块。等同于 `seek`=`n`。

**`seek`**=`n` 在复制前从输出开头跳过 `n` 个块。在非磁带设备上，使用 lseek(2) 操作。否则，读取现有块并丢弃数据。如果用户对该磁带没有读权限，则使用磁带 ioctl(2) 函数调用定位。如果定位操作超过了文件末尾，则从当前文件末尾到指定偏移量之间的空间会用 `NUL` 字节块填充。

**`skip`**=`n` 在复制前从输入开头跳过 `n` 个块。在支持定位的输入上，使用 lseek(2) 操作。否则，读取输入数据并丢弃。对于管道，读取正确数量的字节。对于所有其他设备，读取正确数量的块，不区分读取的是部分块还是完整块。

**`speed`**=`n` 将复制速度限制为每秒 `n` 字节。

**`status`**=`value` 其中 `value` 是以下列表中的符号之一。

**`noxfer`** 不将传输统计信息作为状态输出的最后一行打印。

**`none`** 不打印状态输出。错误消息仍然显示；信息性消息不显示。

**`progress`** 每秒打印一次基本传输统计信息。

**`conv`**=`value`\[,`value ...`] 其中 `value` 是以下列表中的符号之一。

**`ascii , oldascii`** 与 `unblock` 值相同，但在记录转换之前将字符从 EBCDIC 转换为 ASCII。（如果同时指定了 `cbs` 操作数，这些值隐含 `unblock`。）ASCII 有两种转换映射表。`ascii` 值指定推荐的一种，与 AT\&T System V UNIX 兼容。`oldascii` 值指定历史 AT\&T UNIX 和 4.3BSD-Reno 之前的系统使用的一种。

**`block`** 将输入视为由换行符或文件结束符终止的变长记录序列，独立于输入输出块边界。任何尾随的换行符都会被丢弃。每个输入记录转换为固定长度的输出记录，长度由 `cbs` 操作数指定。短于转换记录大小的输入记录用空格填充。长于转换记录大小的输入记录被截断。被截断的输入记录数（如果有）会在复制完成时报告到标准错误输出。

**`ebcdic , ibm , oldebcdic , oldibm`** 与 `block` 值相同，但在记录转换之后将字符从 ASCII 转换为 EBCDIC。（如果同时指定了 `cbs` 操作数，这些值隐含 `block`。）EBCDIC 有四种转换映射表。`ebcdic` 值指定推荐的一种，与 AT\&T System V UNIX 兼容。`ibm` 是略有不同的映射，与 AT\&T System V UNIX 的 `ibm` 值兼容。`oldebcdic` 和 `oldibm` 是历史 AT\&T UNIX 和 4.3BSD-Reno 之前的系统使用的映射表。

**`fdatasync`** 在关闭输出文件之前对其执行 fdatasync(2)。

**`fsync`** 在关闭输出文件之前对其执行 fsync(2)。

**`lcase`** 将大写字符转换为小写字符。

**`pareven , parnone , parodd , parset`** 以指定的校验位输出数据。除非同时指定了从 EBCDIC 到 ASCII 的转换，否则输入中的校验位会被去除。

**`noerror`** 发生输入错误时不停止处理。发生输入错误时，会向标准错误输出写入一条诊断消息，随后是当前的输入输出块计数，格式与标准完成消息相同。如果同时指定了 `sync` 转换，任何缺失的输入数据将被 `NUL` 字节替换（如果指定了面向块的转换值则用空格替换），并作为正常输入缓冲区处理。如果指定了 `fillchar` 选项，命令行上提供的填充字符将覆盖自动选择的填充字符。如果未指定 `sync` 转换，则该输入块不会出现在输出中。对于非磁带或非管道的输入文件，文件偏移量会使用 lseek(2) 定位到发生错误的块之后。

**`notrunc`** 不截断输出文件。这将保留输出文件中未被 `dd` 显式写入的任何块。`notrunc` 值不支持磁带。

**`osync`** 将最终输出块填充至完整的输出块大小。如果转换后输入文件不是输出块大小的整数倍，此转换会强制最终输出块与前面的块大小相同，以便用于要求写入规则大小块的设备。此选项与 `bs`=`n` 块大小规范不兼容。

**`sparse`** 如果一个或多个输出块将完全由 `NUL` 字节组成，则尝试按所需空间定位输出文件，而不是用 `NUL` 填充它们，从而生成稀疏文件。

**`swab`** 交换每对输入字节。如果输入缓冲区的字节数为奇数，最后一个字节在交换时会被忽略。

**`sync`** 将每个输入块填充至输入缓冲区大小。如果指定了面向块的转换值，则用空格作为填充字节，否则使用 `NUL` 字节。

**`ucase`** 将小写字符转换为大写字符。

**`unblock`** 将输入视为固定长度记录序列，独立于输入输出块边界。输入记录的长度由 `cbs` 操作数指定。任何尾随的空格字符都会被丢弃，并追加一个换行符。

指定大小或速度时，应使用十进制、八进制或十六进制的字节数。如果数字以“`b`”、“`k`”、“`m`”、“`g`”、“`t`”、“`p`”或“`w`”结尾，该数字分别乘以 512、1024（1K）、1048576（1M）、1073741824（1G）、1099511627776（1T）、1125899906842624（1P）或一个整数中的字节数。两个或更多数字可以用“`x`”分隔以表示乘积。

完成时，`dd` 会将完整和部分输入输出块数、被截断的输入记录数以及奇数长度的字节交换块数显示到标准错误输出。部分输入块是指读取的字节数少于输入块大小的块。部分输出块是指写入的字节数少于输出块大小的块。向磁带设备写入部分输出块被视为致命错误。否则，将写入块的剩余部分。向字符设备写入部分输出块会产生警告消息。被截断的输入块是指指定了面向变长记录的转换值，且输入行太长无法放入转换记录中，或未以换行符终止的情况。

通常，由输入或转换或两者产生的数据会聚合为指定大小的输出块。到达输入末尾后，任何剩余的输出都会作为一个块写入。这意味着最终输出块可能短于输出块大小。

如果 `dd` 收到 `SIGINFO` 信号（参见 stty(1) 的 `status` 参数），当前的输入输出块计数会以与标准完成消息相同的格式写入标准错误输出。如果 `dd` 收到 `SIGINT` 信号，当前的输入输出块计数会以与标准完成消息相同的格式写入标准错误输出，然后 `dd` 退出。

## 退出状态

`dd` 实用程序成功时退出值为 0，发生错误时大于 0。

## 实例

检查磁盘驱动器是否包含坏块：

```sh
dd if=/dev/ada0 of=/dev/null bs=1m
```

刷新磁盘驱动器，以防止当前可恢复的读取错误发展为不可恢复的读取错误：

```sh
dd if=/dev/ada0 of=/dev/ada0 bs=1m
```

从文件中去除校验位：

```sh
dd if=file conv=parnone of=file.txt
```

检查文件的（偶）校验错误：

```sh
dd if=file conv=pareven | cmp -x - file
```

要创建 Mode-1 CD-ROM 的镜像（这是数据 CD-ROM 光盘常用的格式），使用 2048 字节的块大小：

```sh
dd if=/dev/cd0 of=filename.iso bs=2048
```

将文件系统镜像写入记忆棒，如有必要在末尾用零填充至 1MiB 边界：

```sh
dd if=memstick.img of=/dev/da0 bs=1m conv=noerror,sync
```

## 参见

[cp(1)](/man1/cp.1.md), mt(1), recoverdisk(1), tr(1), [geom(4)](/man4/geom.4.md), trim(8)

## 标准

`dd` 实用程序预期是 IEEE Std 1003.2 ("POSIX.2") 标准的超集。`files` 和 `status` 操作数以及 `ascii`、`ebcdic`、`ibm`、`oldascii`、`oldebcdic` 和 `oldibm` 值是对 POSIX 标准的扩展。

## 历史

`dd` 命令首次出现于 Version 5 AT\&T UNIX。

## 缺陷

[geom(4)](/man4/geom.4.md) 子系统中的保护机制可能会阻止超级用户向磁盘写入块。有关临时禁用这些保护机制的说明，可在 [geom(4)](/man4/geom.4.md) 手册页中找到。
