Linux基础命令-dd拷贝、转换文件

dd是一个强大的Linux命令,用于转换和拷贝文件。它可以按指定大小复制文件并进行转换,如生成文件、拷贝部分数据、转换字符大小写,甚至制作ISO镜像文件和交换分区。文章列举了多个dd命令的实例,包括创建文件、拷贝文件内容、转换字符大小写以及制作交换分区等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

文章目录

dd

命令介绍

语法格式

基本参数

参考实例

1)生成一个200M的新文件

2)拷贝文件的100个字节

3)将文件的字母全部转换成大写

4)将linux自带的光盘制作成iso格式的镜像文件

5)使用dd命令制作1G的交换分区

6)将文件大写字母转换为小写字母

命令总结

dd

命令介绍

先看下帮助文档里的含义

NAME
       dd - convert and copy a file

可以看出来dd(disk dump)的功能是用来转换和拷贝文件的,并且使用dd命令可以按照指定大小的数据块来拷贝文件,并在拷贝的过程中对内容进行转换。

语法格式

继续来看下命令帮助文档内的具体使用

语法:dd 【参数】【对象】

SYNOPSIS
       dd [OPERAND]...
       dd OPTION

基本参数

参数以表格显示

if=文件名输入的文件名,默认为标准输入,即指定源文件
of=文件名输出的文件名,默认为标准输出,即指定目标文件
bs=bytes同时设置读入/输出的“块”的大小为bytes个字节
ibs=bytes一次读入bytes个字节,即指定一个块的大小为bytes个字节
obs=bytes一次输出bytes个字节,即指定一个块的大小为bytes个字节
cbs=bytes一次转换bytes个字节,即指定转换缓冲区大小
count=blocks设置“块”的数量
skip=blocks从输入文件开头跳过blocks个块再开始复制
seek=blocks从输出文件开头跳过blocks个块后再开始复制
conv=<关键字>设置关键字信息来转换文件

 conv的关键字有以下几种:

  • conversion:用指定的参数转换文件。
  • ascii:转换ebcdic为ascii
  • ebcdic:转换ascii为ebcdic
  • ibm:转换ascii为alternate ebcdic
  • block:把每一行转换为长度为cbs,不足部分用空格填充
  • unblock:使每一行的长度都为cbs,不足部分用空格填充
  • lcase:把大写字符转换为小写字符
  • ucase:把小写字符转换为大写字符
  • swap:交换输入的每对字节
  • noerror:出错时不停止
  • notrunc:不截短输出文件
  • sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

参考实例

1)生成一个200M的新文件

/dev/zero的文件可以产生无穷的数据,使用这个设备配合dd使用,就能创建一个指定大小的文件。

[root@localhost ~]# dd if=/dev/zero of=1.txt bs=10M count=20
记录了20+0 的读入
记录了20+0 的写出
209715200字节(210 MB)已复制,3.69047 秒,56.8 MB/秒
[root@localhost ~]# ll -h 1.txt
-rw-r--r--. 1 root root 200M 2月  26 11:16 1.txt

2)拷贝文件的100个字节

可以用来拷贝源文件的数据到目标文件中, 设置要拷贝的大小为100字节,数量为1个。

[root@localhost ~]# dd if=/etc/passwd of=passwd.txt count=1 bs=100
记录了1+0 的读入
记录了1+0 的写出
100字节(100 B)已复制,0.000323161 秒,309 kB/秒
[root@localhost ~]# cat passwd.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

3)将文件的字母全部转换成大写

将源文件转换成目标文件,使用关键字“ucase”,意将小写的字符转换成大写的。

[root@localhost ~]# dd if=/etc/passwd of=passwd1.txt conv=ucase
记录了4+1 的读入
记录了4+1 的写出
2290字节(2.3 kB)已复制,0.00014741 秒,15.5 MB/秒
[root@localhost ~]# cat passwd1.txt | head
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN

4)将linux自带的光盘制作成iso格式的镜像文件

centos7.iso文件系统格式为iso 9660,表示此文件为镜像文件 

[root@localhost ~]# dd if=/dev/cdrom of=centos7.iso 
记录了9203712+0 的读入
记录了9203712+0 的写出
4712300544字节(4.7 GB)已复制,228.538 秒,20.6 MB/秒
[root@localhost ~]# file centos7.iso 
centos7.iso: # ISO 9660 CD-ROM filesystem data 'CentOS 7 x86_64' (bootable)

5)使用dd命令制作1G的交换分区

制作交换分区,先拷贝一个1G的文件出来 ,再使用mkswap命令进行强制格式化后,设置文件权限为600后就可以进行激活挂载了。

[root@localhost ~]# dd if=/dev/zero of=a.txt bs=1M count=1000  #拷贝1G的文件
记录了1000+0 的读入
记录了1000+0 的写出
1048576000字节(1.0 GB)已复制,25.3194 秒,41.4 MB/秒
[root@localhost ~]# mkswap -f a.txt                        #使用-f强制格式化文件
正在设置交换空间版本 1,大小 = 1023996 KiB
无标签,UUID=15c1a284-e382-40c7-9787-4b52d4d52652
#需要设置文件权限为600才能挂载,否则会显示不安全的权限
[root@localhost ~]# chmod 600 a.txt                      
[root@localhost ~]# swapoff -a         #关闭所有交互分区
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.8G        883M        105M         27M        2.9G        2.7G
Swap:            0B          0B          0B
[root@localhost ~]# swapon a.txt      #激活此文件
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.8G        883M        142M         27M        2.8G        2.7G
Swap:          999M          0B        999M
#将设置好的交换分区写入到/etc/fstab文件,使其能开机自启
[root@localhost ~]# echo "/root/a.txt swap swap defaults 0 0" >> /etc/fstab

6)将文件大写字母转换为小写字母

刚可以将小写字母转换成大写字母,也可将大写字母转换成小写字母。

[root@localhost ~]# dd if=passwd1.txt of=passwd2.txt conv=lcase
记录了4+1 的读入
记录了4+1 的写出
2290字节(2.3 kB)已复制,0.00987157 秒,232 kB/秒
[root@localhost ~]# cat passwd2.txt | head -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

命令总结

        这个命令正常使用还是挺有意思的,参数上看着是比较多的内容,实际有几个是比较常能用来搭配使用的,若觉得以上内容还行的,可以点赞支持一下!

### 使用 `dd` 命令高效复制文件的最佳实践 在 Linux 中,`dd` 是一种强大的工具,用于低级数据操作,例如创建磁盘映像、克隆分区以及复制大型文件。为了优化性能并减少资源消耗,在使用 `dd` 复制文件时可以遵循以下最佳实践: #### 1. 设置合适的块大小 (bs 参数) `dd` 的默认块大小为 512 字节 (`bs=512`) ,这通常不适合处理大文件。较大的块大小能够显著提高 I/O 性能,因为减少了读写次数。推荐设置为几兆字节(MB),具体取决于硬件能力。 ```bash dd if=/source/file of=/destination/file bs=4M conv=sparse,status=progress ``` 上述命令中的参数解释如下: - **if**: 输入文件路径。 - **of**: 输出文件路径。 - **bs=4M**: 将块大小设为 4 MB,可以根据需求调整到更大的值如 8M 或更高[^1]。 - **conv=sparse**: 如果源文件中有大量连续零,则会跳过这些区域以节省空间。 - **status=progress**: 显示实时进度更新。 #### 2. 利用同步选项提升一致性 当目标设备是非易失性存储器时,建议加入 `sync` 转换标志来强制完成每次写入后再继续下一次操作,从而增强数据可靠性。 ```bash dd if=/dev/sda1 of=/backup/image.dd bs=1G conv=fsync,sync ``` 这里增加了两个额外转换标记: - **fsync**: 确保所有缓冲区被刷新至实际介质上之前不会返回成功状态给调用者。 - **sync**: 类似于 fsync 功能但作用范围更广一些[^2]。 #### 3. 并行化多线程传输过程 对于非常庞大的文件或者需要跨网络环境下的远程拷贝场景来说,单一线程可能无法充分利用带宽资源。此时可以通过管道组合多个进程实现并发执行效果。 ```bash pv /path/to/largefile | gzip -c | ssh user@remote 'dd of=/target/path/file.gz' ``` 此脚本利用了三个独立程序共同协作完成任务: - **pv**: 实现可视化的流量监控功能的同时保持原有输入流不变。 - **gzip**: 对原始数据压缩减小体积加快传送速度。 - **ssh & dd**: 远端登录并通过标准输出重定向保存最终结果[^3]。 #### 4. 测试不同配置找到最优解 由于每套系统的具体情况都不尽相同,因此有必要针对特定条件做适当微调测试才能得出最理想的结果。比如改变 buffer 缓冲区容量(`ibs`, `obs`)或是尝试不同的调度算法等方法都值得探索一番。 --- ```python import subprocess def copy_large_file(source, destination, block_size='4M'): """Use DD Command to Copy Large Files Efficiently.""" cmd = f"dd if={source} of={destination} bs={block_size} conv=sparse,status=progress" result = subprocess.run(cmd, shell=True, check=True, text=True, capture_output=True) return result.stdout.strip() # Example Usage output_message = copy_large_file('/mnt/source.iso', '/home/user/copy.iso') print(output_message) ``` 以上 Python 函数封装了一个简单的接口用来简化日常工作中频繁使用的重复劳动环节。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux学习中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值