Linux dd、split、csplit命令

在Linux最常用的文件生成和切片工具是dd,它功能比较全面,但无法以行为单位提取文件数据,也无法直接将文件按大小或行数进行均分(除非借助循环)。另两款数据分割工具split和csplit能够比较轻松地实现这些需求。csplit是split的升级版。

1.1 dd命令

从if指定的文件读取数据,写入到of指定的文件。使用bs指定读取和写入的块大小,使用count指定读取和写入的数据块数量,bs和count相乘就是文件总大小。可以指定skip忽略读取if指定文件的前多少个块,seek指定写入到of指定文件时忽略前多少个块。

dd if=/dev/zero of=/tmp/abc.1 bs=1M count=20

if是input file,of是output file;bs有c(1byte)、w(2bytes)、b(512bytes)、kB(1000bytes)、K(1024bytes)、MB(1000)、M(1024)和GB、G等几种单位。因此,不要随意在单位后加上字母B。

假设现有文件CentOS.iso的大小1.3G,需要将其切分后还原,切分的第一个小文件大小为500M。

dd if=/tmp/CentOS.iso of=/tmp/CentOS1.iso bs=2M count=250

生成第二个小文件,由于第二个小文件不知道具体大小,所以不指定count选项。由于第二个小文件要从第500M处开始切分,于是需要忽略CentOS.iso的前500M。假设bs=2M,于是skip掉的数据块数量为250。

dd if=/tmp/CentOS.iso of=/tmp/CentOS2.iso bs=2M skip=250

现在CentOS.iso=CentOS1.iso+CentOS2.iso。可以将CentOS[1-2].iso还原。

cat CentOS1.iso CentOS2.iso >CentOS_m.iso

比较CentOS_m.iso和CentOS.iso的md5值,它们是完全一样的。

shell> md5sum CentOS_m.iso CentOS.iso 504dbef14aed9b5990461f85d9fdc667 CentOS_m.iso 504dbef14aed9b5990461f85d9fdc667 CentOS.iso

那么seek选项呢?和skip有什么区别?skip选项是忽略读取时的前N个数据块,而seek是忽略写入文件的前N个数据块。假如要写入的文件为a.log,则seek=2时,将从a.log的第3个数据块开始追加数据,如果a.log文件本身大小就不足2个数据块,则缺少的部分自动使用/dev/zero填充。

于是,在有了CentOS1.iso的基础上,要将其还原为和CentOS.iso相同的文件,可以使用下面的方法:

dd if=/tmp/CentOS.iso of=/tmp/CentOS1.iso bs=2M skip=250 seek=250

还原后,它们的md5值也是相同的。

shell> md5sum CentOS1.iso CentOS.iso 504dbef14aed9b5990461f85d9fdc667 CentOS1.iso 504dbef14aed9b5990461f85d9fdc667 CentOS.iso

1.2 split命令

split工具的功能是将文件切分为多个小文件。既然要生成多个小文件,必然要指定切分文件的单位,支持按行切分以及按文件大小切分,另外还需解决小文件命名的问题。例如,文件名前缀、后缀。如果未明确指定前缀,则默认的前缀为"x"。

以下是命令的语法说明:

split [OPTION]... [INPUT [PREFIX]]

  

-a N:生成长度为N的后缀,默认N=2

-b N:每个小文件的N,即按文件大小切分文件。支持K,M,G,T(换算单位1024)或KB,MB,GB(换算单位1000)等,默认单位为字节

-l N:每个小文件中有N行,即按行切分文件

-d N:指定生成数值格式的后缀替代默认的字母后缀,数值从N开始,默认为0。例如两位长度的后缀01/02/03

--additional-suffix=string:为每个小文件追加额外的后缀,例如加上".log"。有些老版本不支持该选项,在CentOS 7.2上已支持。

  

INPUT:指定待切分的输入文件,如要切分标准输入,则使用"-"

PREFIX:指定小文件的前缀,如果未指定,则默认为"x"

例如,将/etc/fstab按行切分,每5行切分一次,并指定小文件的前缀为"fs_",后缀为数值后缀,且后缀长度为2。

[root@linuxidc ~]# split -l 5 -d -a 2 /etc/fstab fs_ [root@linuxidc ~]# ls fs_00 fs_01 fs_02

查看任一小文件。

[root@linuxidc ~]# cat fs_01 # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 / xfs defaults 0 0 UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot xfs defaults 0 0

可以将这些切分后的小文件重新组装还原。例如,将上面的三个小文件还原为~/fstab.bak。

[root@linuxidc ~]# cat fs_0[0-2] >~/fstab.bak

还原后,它们的内容是完全一致的。可以使用md5sum比较。

[root@linuxidc ~]# md5sum /etc/fstab ~/fstab.bak 29b94c500f484040a675cb4ef81c87bf /etc/fstab 29b94c500f484040a675cb4ef81c87bf /root/fstab.bak

还可以将标准输入的数据进行切分,并分别写入到小文件中。例如:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13489.html