一天一个shell命令 文本操作系列-linux dd使用教程
今天第一天写,先说下写shell脚本的基本知识
1.shell脚本以.sh为扩展名,通常运行./${filename}.sh或者sh${filename}.sh
2.shell脚本开头以#!/bin/bash#!读作“shebang”
3.开启调试 #!/bin/bash–xv
4./dev/null任何东西丢进去都会消失,linux黑洞。/dev/zero用于初始化,会产生0
今天先介绍dd命令
由来(全称):本来应根据其功能描述“Convertancopy”命名为“cc”,但“cc”已经被用以代表“CComplier”,所以命名为“dd”
开篇例子:
1. ddif=infile.log of=outfile.logbs=1Mcount=1
拷贝infile.log内容到outfile.log.一次读写比特数为1M,每次读写一个块(1M,由bs决定)
2. echo-n"helloworld"|ddcbs=1conv=unblock2>/dev/null
主要演示cbs,每次转换一个字节,conv=unblock是将cbs大小的块中尾部的空格替换为一个换行符 2>是错误信息输出流 /dev/null开头介绍了
解读help:
(不愿意看这么一大段,尝试先跳过,看解读)
用法:dd[操作数]...
或:dd选项
复制文件,依照操作数转换并格式化。
bs=比特数 一次读写的比特数
cbs=比特数 一次转换的比特数
conv=CONVS 依照每个逗号分割的标志列表转换文件
count=块数 只将指定个块数复制到块
ibs=比特数 一次读取的比特数(默认:512)
if=文件 从指定文件中读取
iflag=符号 按照以逗号分隔的符号列表指定的方式读取
obs=比特数 一次写入指定比特数(默认:512)
of=文件 写入到指定文件
oflag=符号 按照以逗号分隔的符号列表指定的方式写入
seek=块数 在输出开始处跳过指定的块数
skip=块数 在输入开始处跳过指定的块数
status=noxfer 禁止传输统计
块和字节数后可能带有以下的一个或多个后缀:
c=1,w=2,b=512,kB=1000,K=1024,MB=1000*1000,M=1024*1024,xM=M
GB=1000*1000*1000,G=1024*1024*1024,andsoonforT,P,E,Z,Y.
每个CONV符号可能为:
ascii 由EBCDIC码转换至ASCII码
ebcdic 由ASCII码转换至EBCDIC码
ibm 由ASCII码转换至替换的EBCDIC码
block 将结束字符块里的换行替换成等长的空格
unblock 将cbs大小的块中尾部的空格替换为一个换行符
lcase 将大写字符转换为小写
ucase 将小写字符转换为大写
swab 交换每一对输入数据字节
sync 将每个输入数据块以NUL字符填满至ibs的大小;当配合block
或unblock时,会以空格代替NUL字符填充
excl failiftheoutputfilealreadyexists
nocreat donotcreatetheoutputfile
notrunc 不截断输出文件
noerror 读取数据发生错误后仍然继续
fdatasync 结束前将输出文件数据写入磁盘
fsync 类似上面,但是元数据也一同写入
FLAG符号可以是:
append 追加模式(仅对输出有意义;隐含了conv=notrunc)
direct 使用直接I/O存取模式
directory 除非是目录,否则directory失败
dsync 使用同步I/O存取模式
sync 与上者类似,但同时也对元数据生效
fullblock 为输入积累完整块(仅iflag)
nonblock 使用无阻塞I/O存取模式
noatime 不更新存取时间
nocache 丢弃缓存数据
noctty 不根据文件指派控制终端
nofollow 不跟随链接文件
解读:
1.bsibsobs cbs
bs:一次读写=ibs+obs
ibs:一次读
obs:一次写
cbs:一次转换
2.ifof
if是读取的文件
of是输出的文件
3.seekskip
skip在从if中读取时 跳过多少比特
seek在写入of时,跳过多少比特
实战例子:
1.批量生成随机名称的测试文件
foriin{10..10} do ddif=/dev/zeroof=junk.test$ibs="$RANDOM"Kcount=20 done
2.备份和恢复
备份
ddif=abc.gzof=abc.gz.bak1bs=1kcount=10000 ddif=abc.gzof=abc.gz.bak2bs=1kskip=10000count=70000 ddif=abc.gzof=abc.gz.bak3bs=1kskip=80000
恢复方法如下:
ddif=abc.gz.bak1of=abc.gz ddif=abc.gz.bak2of=abc.gzbs=1kseek=10000 ddif=abc.gz.bak3of=abc.gzbs=1kseek=80000
3.转换大小写
生成大写:ddif=dd.txtof=my.logbs=1Mcount=1conv=ucase
生成小写:为了不懒惰,留给读者试试
4.拷贝自己
file_subscript=copy ddif=$0of=$0.$file_subscript2>/dev/null
5.要把一张软盘的内容拷贝到另一张软盘上,利用/tmp作为临时存储区。把源盘插入驱动器中,输入下述命令:
$ddif=/dev/fd0of=/tmp/tmpfile
拷贝完成后,将源盘从驱动器中取出,把目标盘插入,输入命令:
$ddif=/tmp/tmpfileof=/dev/fd0
软盘拷贝完成后,应该将临时文件删除:
$rm/tmp/tmpfile
6.把net.i这个文件写入软盘中,并设定读/写缓冲区的数目。
(注意:软盘中的内容会被完全覆盖掉)
$ddif=net.iof=/dev/fd0bs=16384
7.将文件sfile拷贝到文件dfile中。
$ddif=sfileof=dfile
8.创建一个100M的空文件
ddif=/dev/zeroof=hello.txtbs=100Mcount=1
=============================================
/dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
/dev/zero,是一个输入设备,你可你用它来初始化文件。
/dev/null------它是空设备,也称为位桶(bitbucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。
/dev/zero------该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。
$ddif=/dev/zeroof=./test.txtbs=1kcount=1
$ls-l
total4
-rw-r--r-- 1oracle dba 1024Jul1516:56test.txt
eg:
$find/-nameaccess_log 2>/dev/null
本文出自“书生”博客