当前位置 博文首页 > 一天一个shell命令 文本操作系列-linux dd使用教程

    一天一个shell命令 文本操作系列-linux dd使用教程

    作者:admin 时间:2021-07-08 18:45

    今天第一天写,先说下写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 命令

    由来(全称):本来应根据其功能描述“Convert an copy”命名为“cc”,但“cc”已经被用以代表“CComplier”,所以命名为“dd”

    开篇例子:

    1.  dd if=infile.log  of=outfile.log bs=1M count=1

      拷贝 infile.log内容 到 outfile.log. 一次读写比特数为1M , 每次读写一个块(1M,由bs决定)

    2.  echo -n "hello world" | dd cbs=1 conv=unblock 2>/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, and so on for T, 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        fail if the output file already exists
       nocreat    do not create the output file
       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. bs ibs obs  cbs

    bs: 一次 读写 = ibs+obs
    ibs: 一次读
    obs: 一次写
    cbs: 一次转换

    2. if of

    if 是读取的文件
    of 是输出的文件

    3. seek skip

    skip 在从if中读取时  跳过多少比特
    seek 在写入of时, 跳过多少比特

    实战例子:

    1. 批量生成随机名称的测试文件

    for i in {10..10}  
    do  
    dd if=/dev/zero of=junk.test$i bs="$RANDOM"K count=20  
    done

    2. 备份和恢复

    备份

    dd if=abc.gz of=abc.gz.bak1 bs=1k count=10000  
    dd if=abc.gz of=abc.gz.bak2 bs=1k skip=10000 count=70000  
    dd if=abc.gz of=abc.gz.bak3 bs=1k skip=80000 

    恢复方法如下:

    dd if=abc.gz.bak1 of=abc.gz  
    dd if=abc.gz.bak2 of=abc.gz bs=1k seek=10000  
    dd if=abc.gz.bak3 of=abc.gz bs=1k seek=80000 

    3. 转换大小写

    生成大写:dd if=dd.txt of=my.log bs=1M count=1 conv=ucase

    生成小写:为了不懒惰,留给读者试试

    4. 拷贝自己 

    复制代码 代码如下:

    file_subscript=copy  
    dd if=$0 of=$0.$file_subscript 2>/dev/null

    5.要把一张软盘的内容拷贝到另一张软盘上,利用/tmp作为临时存储区。把源盘插入驱动器中,输入下述命令:

    $ dd if =/dev/fd0 of = /tmp/tmpfile

    拷贝完成后,将源盘从驱动器中取出,把目标盘插入,输入命令:

    $ dd if = /tmp/tmpfile of =/dev/fd0

    软盘拷贝完成后,应该将临时文件删除:

    $ rm /tmp/tmpfile  

    6. 把net.i这个文件写入软盘中,并设定读/写缓冲区的数目。

    (注意:软盘中的内容会被完全覆盖掉)

    $ dd if = net.i of = /dev/fd0 bs = 16384  

    7.将文件sfile拷贝到文件 dfile中。

    $ dd if=sfile of=dfile

    8.创建一个100M的空文件

    dd if=/dev/zero of=hello.txt bs=100M count=1

    =============================================

    /dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
    /dev/zero,是一个输入设备,你可你用它来初始化文件。

    /dev/null------它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。
    /dev/zero------该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。
    $ dd if=/dev/zero of=./test.txt bs=1k count=1
    $ ls -l
    total 4
    -rw-r--r--     1 oracle    dba           1024 Jul 15 16:56 test.txt

    eg:

    $ find / -name access_log   2>/dev/null


    本文出自 “书生” 博客

    jsjbwy