有时候需要测试磁盘读写速度,或者临时读写文件,不想临时写代码?有没有测试使用的命令?当然有!
dd命令
dd命令可以用于文件的拷贝或者内容转换。常见操作选项如下:
- bs=BYTES 一次读写字节数
- ibs=BYTES 一次读的字节数
- obs=BYTES 一次写的字节数
- cbs=BYTES 一次转换的字节数
- count=N 读写次数
- of=FILE 将内容写到FILE,默认写入标准输出
- if=FILE 从FILE中读取,默认从标准输入读取
- conv=CONVS 转换标志
更多选项可查看man手册。
来看一些实例。
将文件的内容进行大小写转换
加入文件test.txt中有以下内容:1
shouwangxiansheng
现在要将内容转换为大写:1
2
3
4$ dd if=test.txt of=utest.txt conv=ucase
0+1 records in
0+1 records out
18 bytes copied, 0.0123523 s, 1.5 kB/s
执行完成后,再看看utest.txt中的内容:1
SHOUWANGXIANSHEN
看到没,已经将所有内容转换为大写了。
当然还有其他方法:1
$ cat test.txt | tr 'a-z' 'A-Z' > utest.txt
解释一下,conv=ucase,表示转换操作是转换为大写,你还可以使用:
- lcase 转换为小写
- ucase 转换为大写
- swab 相邻字节交换
拷贝文件
例如将test.txt文件内容拷贝到test0.txt文件,每次拷贝1024字节:1
$ dd if=test.txt of=test0.txt bs=1024
读取指定次数:1
$ dd if=a of=b bs=1024 count=10 #读取10次
跳过指定块大小开始读取:
假设ibs=1,那么,每次读取1字节,而skip=4,则会从第五个字节开始读取:1
dd if=test.txt of=test0.txt ibs=1 skip=4
得到内容:1
2$cat test0.txt
wangxiansheng
那如果要从指定位置开始写呢?1
dd if=test.txt of=test0.txt obs=1 seek=5
这些写入的内容就会从test0.txt的第六个字节开始写,而会保留前面的5个字节。
注意,由于这里我设置了ibs或者obs为1,所以skip和seek的单位都是字节,但是如果前面设置的是如1M,那么跳过的就是N兆了。
生成随机文件
还记得在《Linux字符设备文件》中提到的特殊字符文件吗?结合dd命令,我们可以生成一些随机内容的文件。1
$ dd if=/dev/urandom of=temp.txt count=2
执行之后就会读取2个块大小的数据到temp.txt中。
磁盘读写测试
由于dd命令每次执行完成后都会显示其速度,因此可以利用它来测试当前的磁盘读写情况。
这里还有一个选项oflag=FLAGS用来设置一些读写方式,FLAG常见选项有:
- direct 使用直接IO
- nonblock 使用非阻塞IO
- noatime 不更新访问时间
- nocache 丢弃缓存
- sync 读写一次就写到磁盘
- fsync 最后要写到磁盘
1 | $ dd if=/dev/urandom of=testfile count=100 oflag=sync |
总结
dd命令可用于文件拷贝,文件内容大小写转换,磁盘读写测试等。