文件的切分split和结合工具cat介绍
2010-05-09 11:25:25 阿炯

从服务器上下载大文件,但网络环境不好,因此将大文件分成多个小文件,在使用rsync同步,会比直接同步或下载好许多。
按行(50000)将大文件分成小文件,每个小文件以'file_'为前缀,数字为其后缀。
split -d -l 50000 freeoa.bz2 file_

按大小(128m)将大文件分成小文件,每个小文件以'freeoa_'为前缀,26个字母为其后缀。
split -b 128m freeoa.bz2 freeoa_

将小文件组合为原来的大文件
for f in `ls file_*`; do cat $f >> orig_bigfile.bz2;done

下面将会把此种操作做深入的分析,以加强对其原理及方法的学习。

1、文件的切分及结合工具
可能我们遇到这种情况,有时文件比较大,想上传到服务器上,但由于服务器管理员为了安全考虑,把上传空间作了限制,比如只能上传20M的文件,如果我们文件的体积在100M的,有时就是压缩也不能满足服务器上传的限制。这时我们就要考虑切分文件了,把100M的文件,切分成若干份,然后传到服务器上。切分后的每个文件都是原文件的组成部份。如果要获得整个完整的文件,我们就需要文件的结合工具。

所以我们引入了文件切分工具split和csplit,文件的结合工具cat;
  
2、文件的切分工具 split 和csplit
split 是把一个文件拆分为长度或体积相等的若干文件的工具;

2.1 split 工具
split 是把一个文件拆分为长度或体积相等的若干文件的工具;

2.11 语法格式
split [参数选项] infile [outfile]
split 把输入的文件拆分为若干体积或长度相等的文件,输入文件保持不变,只是把结果拆分结果写到outfileaa、outfileab ... ... 等文件中。如果我们不指定outfile,被拆分后的文件会写到 xaa、xab ... ...。

参数
-l n 把infile拆分为具有n行的段,默认值为1000
-b n[bkm] 以体积为单位的拆分,约定每拆分后每个文件的大小 ,b代表512B,k代表1KB,m代表1MB。
-C bytes[bkm] 把bytes的最大值放入文件,坚持增加完整的行;
- 从标准输入读取;
--help 帮助;

2.12 split实例应用
实例一:比如我们想切分一个文件linuxdoc.txt,切分后,每两行存为一个新文件。
# more linuxdoc.txt 注:linuxdoc.txt 文件内容查看;
111111111
222222222
333333333
444444444
555555555
666666666
777777777
888888888
999999999
000000000
# split -l 2 linuxdoc.txt linuxdocsp 注:切分linuxdoc.txt文件,被切分后的文件名linuxdocsp开头。
# ls linuxdocspa* 注:查看切分后的所有文件;
linuxdocspaa linuxdocspab linuxdocspac linuxdocspad linuxdocspae

# more linuxdocspa* 注:查看这些文件的内容;是不是每个文件都是两行呢?
linuxdocspaa
::::::::::::::
111111111
222222222
::::::::::::::
linuxdocspab
::::::::::::::
333333333
444444444
::::::::::::::
linuxdocspac
::::::::::::::
555555555
666666666
::::::::::::::
linuxdocspad
::::::::::::::
777777777
888888888
::::::::::::::
linuxdocspae
::::::::::::::
999999999
000000000

实例二:以文件体积为单位的切分;
# ls -lh linuxdoc.txt
-rw-r--r-- 1 root root 100 04-27 15:56 linuxdoc.txt
# more linuxdoc.txt
111111111
222222222
333333333
444444444
555555555
666666666
777777777
888888888
999999999
000000000

# split -b 30 linuxdoc.txt linuxdocwsp 如果指定切分体积大小后面没有接单位,默认是B;
# ls -lh linuxdocwspa*
-rw-r--r-- 1 root root 30 04-27 16:10 linuxdocwspaa
-rw-r--r-- 1 root root 30 04-27 16:10 linuxdocwspab
-rw-r--r-- 1 root root 30 04-27 16:10 linuxdocwspac
-rw-r--r-- 1 root root 10 04-27 16:10 linuxdocwspad
# more linuxdocwspa*
::::::::::::::
linuxdocwspaa
::::::::::::::
111111111
222222222
333333333
::::::::::::::
linuxdocwspab
::::::::::::::
444444444
555555555
666666666
::::::::::::::
linuxdocwspac
::::::::::::::
777777777
888888888
999999999
::::::::::::::
linuxdocwspad
::::::::::::::
000000000

对于切分体积的说明:如果没有指定单位,默认单位是B。还有其它的单位,比如b、k、m。看下面的例子;

# ls -lh moretool.txt
-rw-r--r-- 1 root root 13K 04-27 16:17 moretool.txt 注:文件大小为13K;
#split -b 3k moretool.txt moretoolwsp 注: 切分后每个文件大小为3K;

实例三:从标准输入读取的实例;
# ls -lh /etc | split -l 40 - etcfilelist
# ls etcfilelista*
etcfilelistaa etcfilelistab etcfilelistac etcfilelistad etcfilelistae etcfilelistaf etcfilelistag

注:本指令的意思是用ls以长格式列出/etc目录的文件(不包括.file格式的文件,也就是隐藏文件),把输入的内容传递给split,让 split来切分每40行为存为一个文件,文件名的开头以etcfilelist开始。注意40后面的- ,表示从标准输入读取,在这里就表示键盘输入了,也就是读取ls -lh /etc 指令的内容。然后split切分。

2.2 csplit 工具
正在补充之中... ...

3、文件的连接工具 cat
cat 工具如果后面直接文件文件名,就可以查看文件的内容。现在我们仍得把cat工具连接文件的功能单列出来说一说。

3.1 把多个文件合并到一个新的文件中
命令格式如下:
cat file1 file2 file3 ... ... > filen

我们可以把file1、file2、file3 等多个文件合并到一个文件中,其中filen是在合并这些文件的同时新建的文件,而不是已存在的文件;
# cat sir01.txt
123456
# cat sir02.txt
56789
# cat sir03.txt
09876
# cat sir01.txt sir02.txt sir03.txt > sir04.txt
# more sir04.txt
123456
56789
09876

3.2 把多个文件合并追加到一个已存在的文件中
命令格式如下:
cat file1 file2 file3 ... ... >> filen

如果我们想把file1、file2、file3等多个文件内容连接起来,并追加到一个已存在的文件filen中,应该用追加的方法;
# more sir01.txt
123456
# cat sir01.txt
123456
# cat sir02.txt
56789
# cat sir03.txt
09876
# cat sir05.txt
aaaaa
bbbbb

# cat sir01.txt sir02.txt sir03.txt >> sir05.txt
# cat sir05.txt
aaaaa
bbbbb
123456
56789
09876

4、关于分拆文件和连接文件的安全性
比如我们把一个大的文件分拆为多个小文件时,肯定会考虑到,我们重新把一个一个小的分拆文件连接起来,会不会能和原文件保持一致 。这样的疑问其实也是有道理的,因为这关系到一个文件的完整性,如果真的合并不到一起,关系到文件的完整性和安全性。这时就涉及到文件的校验工具,一般我们是通过MD5工具来校验对比。

# ls -lh myfile.img 注:查看myfile.img文件属性;
-rw-r--r-- 1 root root 7.9M 04-27 20:35 myfile.img

# split -b 4m myfile.img myfileSp 注:分拆为大小为4M的文件;
# ls -lh myfileSp* 注:列出分拆文件,我们看到有两个文件;
-rw-r--r-- 1 root root 4.0M 04-27 20:37 myfileSpaa
-rw-r--r-- 1 root root 3.9M 04-27 20:37 myfileSpab

# cat myfileSp* > newmyfile.img 注:我们尝试合并文件到一个新文件中;
# ls -lh newmyfile.img
-rw-r--r-- 1 root root 7.9M 04-27 20:38 newmyfile.img
# md5sum newmyfile.img myfile.img 注:我们对比合并后文件和原文件的MD5值,如果M55值相同,就是完整的;
7eb24d865a14fa3227633816800522c1 myfile.img
7eb24d865a14fa3227633816800522c1 newmyfile.img

上面是一个实例,把myfile.img文件分拆为4M大小的文件,然后再把两个文件连接起来,然后校验是不是合并后的文件和原文件的MD5值是相同的,如果相同,证明分拆过程是安全的。

5、关于本文
文件的切分工具和结合工具只是介绍性的,用法也相对简单。我们知道有这两个工具就行了,用的时候查man和help就OK。

6、后记
关于目录和文件管理的文档写了有一些了,我想为这些文档写个归类文档,这样新手查看就容易一点。另外感觉应该写一下字符模式下的文本编辑工具的简单用法,比如vi或nano之类的。

本文源自:互联网

该文章最后由 阿炯 于 2014-01-07 16:49:26 更新,目前是第 2 版。