• split


    gg

     

    split 的命令格式:
    
    split [-b ][-C ][-][-l ]       [要切割的文件]     [输出文件名前缀]          [-a ]
    
    
    dd if=/dev/zero bs=1024 count=700000 of=king_of_ring.avi
    
    按照文件大小切割
    
    -a 4 表示参数指定数字位数,指定输出文件的文件名的后缀的长度,默认长度为2
    -d igoodful_  表示输出的切割后的文件名称前缀
    
    filename 表示要被切割的文件
    
    
    1)-b  10 表示按照文件大小二进制切割,单位默认是字节,但可以指定,如K、M、G、T单位
    
    split  -b  10  filename   -d igoodful_  -a 4
    split  -b  10K  filename  -d igoodful_  -a 4
    split  -b  10M  filename  -d igoodful_  -a 4
    split  -b  10G  filename  -d igoodful_  -a 4
    
    2)-C  按照文件大小分割,但不会打碎行。
    
    split  -C  10  filename   -d igoodful_  -a 4
    split  -C  10K  filename  -d igoodful_  -a 4
    split  -C  10M  filename  -d igoodful_  -a 4
    split  -C  10G  filename  -d igoodful_  -a 4
    
    
     3) -l  按照文件行数分割文件
    
    split  -l  10  filename   -d  igoodful_  -a  4

     

     

     

     

    合久必分

    闲言少叙,我们现在就来介绍拆分的方法。先使用 dd 命令来生成一个 700MB 文件来作为我们的拆分对象:

    [root@roclinux ~]$ dd if=/dev/zero bs=1024 count=700000 of=king_of_ring.avi
    700000+0 records in
    700000+0 records out
    716800000 bytes (717 MB) copied, 12.9189 s, 55.5 MB/s
     
    [root@roclinux ~]$  ls -l king_of_ring.avi
    -rw-r--r-- 1 root root 716800000 Apr 12 13:01 king_of_ring.avi


    美国大片的文件大小是 700MB,而我手边仅有的两个优盘,都是 512MB 大小的。我打算把文件以 400MB 作为一个拆分单位,来进行拆分。这里使用到了 split 的-b选项,来指定每个拆分文件的大小:

    [root@roclinux ~]$ split -b 400M king_of_ring.avi
     
    [root@roclinux ~]$ ls -l
    total 1400008
    -rw-r--r-- 1 root root 716800000 Apr 12 13:01 king_of_ring.avi
    -rw-r--r-- 1 root root 419430400 Apr 12 13:04 xaa
    -rw-r--r-- 1 root root 297369600 Apr 12 13:04 xab


    看!分身完毕!咦,怎么多出了 xaa 和 xab 两个文件,这么奇怪的名字?

    是的,你没看错,在没有明确指定拆分后文件的命名方式的情况下,split 会默认采用 x 字符作为文件前缀,采用类似 aa、ab、ac 的字符串依次作为文件后缀。于是,就出现了我们上面看到的 xaa、xab 了。

    从文件大小来看,如我们所愿,电影文件的确被切割成了一个 400MB 的文件、一个 300MB 的文件,终于可以装到两个优盘里了。

    知其然,知其所以然

    知道了拆分命令后,我们来一起学习一下 split 的命令格式和常用选项。

    split 的作用很好描述,就是将文件按照一定规则进行拆分。一般情况下,我们可以按照文件大小来进行拆分,如果是文本文件的话,还可以按照行数来进行拆分,默认是 1000 行作为一个拆分单位。

    默认情况下,分割后的文件的名称会以 x 作为前缀,以 aa、ab、ac 这样的双字母格式作为后缀,形成 xaa、xab 这样的名称格式。

    我们来一起看看 split 的命令格式:

    split [-b ][-C ][-][-l ][要切割的文件][输出文件名前缀][-a ]


    最常用的选项,都在这里了:

    • -b<字节>:指定按多少字节进行拆分,也可以指定 K、M、G、T 等单位。
    • -<行数>或-l<行数>:指定每多少行要拆分成一个文件。
    • 输出文件名前缀:设置拆分后的文件的名称前缀,split 会自动在前缀后加上编号,默认从 aa 开始。
    • -a<后缀长度>:默认的后缀长度是 2,也就是按 aa、ab、ac 这样的格式依次编号。

    分久必合

    完成了美国大片的拆分,我赶赴朋友家,打开他的电脑,优盘插上,使用 cat 命令将拆分文件 xaa 和 xab 合并成一个文件,可以看出合并后的文件和源文件的大小是一致的:

    [root@roclinux ~]$ cat xaa xab > king_of_ring_merge.avi
     
    [root@roclinux ~]$ ls -l
    total 2100012
    -rw-r--r-- 1 root root 716800000 Apr 12 13:01 king_of_ring.avi
    -rw-r--r-- 1 root root 716800000 Apr 12 13:07 king_of_ring_merge.avi
    -rw-r--r-- 1 root root 419430400 Apr 12 13:04 xaa
    -rw-r--r-- 1 root root 297369600 Apr 12 13:04 xab


    对了,如果是在 Windows 下的话,我们要先运行 cmd,然后用 copy 命令来进行文件的合并:

    copy /b xaa + xab king_of_ring.avi


    格式上和 Linux 有些区别,但原理是一样的。

    设置拆分文件的名称前缀

    上面例子中,我们没有指定拆分文件的名称前缀,结果拆分后的文件名都是 aa、ab 这样的名称,这样的名称既不达意也不美观。

    下面的例子,我们尝试以 king_of_ring_part_ 作为拆分后文件的名称前缀:

    #我们指定了king_of_ring_part_前缀
    [root@roclinux ~]$ split -b 400m king_of_ring.avi king_of_ring_part_
     
    #可以看到, 文件名的可读性提高了很多
    [root@roclinux ~]$ ls -l king*
    -rw-r--r-- 1 root root 716800000 Feb 25 18:29 king_of_ring.avi
    -rw-r--r-- 1 root root 419430400 Feb 25 19:24 king_of_ring_part_aa
    -rw-r--r-- 1 root root 297369600 Feb 25 19:24 king_of_ring_part_ab


    文件名的可读性是不是提高了不少,从文件名称就可以看出来是美国大片的拆分文件啦。

    设置数字后缀

    如果大家看不惯以 aa、ab 这种字母作为文件后缀,我们还可以通过-d选项来指定数字形式的文件后缀:

    #使用了-d选项
    [root@roclinux ~]$ split -b 400m -d king_of_ring.avi king_of_ring_part_
     
    #后缀从原来的aa、ab变成了00、01
    [root@roclinux ~]$ ls -l king*
    -rw-r--r-- 1 root root 716800000 Feb 25 18:29 king_of_ring.avi
    -rw-r--r-- 1 root root 419430400 Feb 25 19:24 king_of_ring_part_00
    -rw-r--r-- 1 root root 297369600 Feb 25 19:24 king_of_ring_part_01


    对于中国人来说,数字形式的后缀,增加了文件名称的可读性。

    按照行数进行拆分

    前面我们讲的是按照文件大小(如 400MB)进行文件拆分的方法,但是并非所有情况都适合于用文件大小作为拆分单元。比如,我们希望把 /etc/passwd 文件按照一个文件 10 行记录的方式进行拆分,又该怎么操作呢?

    #使用-N来指定拆分的行数,本例中为-10
    [root@roclinux ~]$ split -d -10 /etc/passwd my_passwd_
     
    #可以看到拆分成功
    [root@roclinux ~]$ wc -l my_passwd_*
      10 my_passwd_00
      10 my_passwd_01
       5 my_passwd_02
      25 total

    合并后的校验不可少

    需要注意的是,在通过网络来传输大文件,或者在设备之间复制大文件的时候,可能会出现传输前后数据不一致的情况。

    使用 split 来拆分大文件仅仅是故事的开始,操作完毕后化零为整、完璧归赵才是完美的结局。因此需要在合并文件后进行文件的完整性校验,推荐使用 md5sum 来计算和比对前后两个大文件的 md5 值。

    #对原先的文件计算md5值
    [root@roclinux ~]$ md5sum king_of_ring.avi
    eacff27bf2db99c7301383b7d8c1c07c  king_of_ring.avi
     
    #对合并后的文件计算md5值, 并与原值进行比较
    [root@roclinux ~]$ md5sum king_of_ring_merge.avi
    eacff27bf2db99c7301383b7d8c1c07c  king_of_ring_merge.avi

    如果前后一致,那么恭喜你,文件合并成功!

  • 相关阅读:
    C++内存分配
    扩展哈夫曼编码
    用递归函数和栈操作逆序一个栈
    非递归遍历二叉树
    malloc/free和new/delete
    洗牌算法及其证明
    野指针问题
    计算编辑距离
    数组指针/指针数组的使用
    sizeof/strlen/length
  • 原文地址:https://www.cnblogs.com/igoodful/p/13323149.html
Copyright © 2020-2023  润新知