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,切分后,每两行存为一个新文件。
[root@localhost ~]# more linuxdoc.txt 注:linuxdoc.txt 文件内容查看;
111111111
222222222
333333333
444444444
555555555
666666666
777777777
888888888
999999999
000000000
[root@localhost ~]# split -l 2 linuxdoc.txt linuxdocsp 注:切分linuxdoc.txt文件,被切分后的文件名linuxdocsp开头
[root@localhost ~]# ls linuxdocspa* 注:查看切分后的所有文件;
linuxdocspaa linuxdocspab linuxdocspac linuxdocspad linuxdocspae
[root@localhost ~]# more linuxdocspa* 注:查看这些文件的内容;是不是每个文件都是两行呢?
linuxdocspaa
::::::::::::::
111111111
222222222
::::::::::::::
linuxdocspab
::::::::::::::
333333333
444444444
::::::::::::::
linuxdocspac
::::::::::::::
555555555
666666666
::::::::::::::
linuxdocspad
::::::::::::::
777777777
888888888
::::::::::::::
linuxdocspae
::::::::::::::
999999999
000000000
实例二:以文件体积为单位的切分;
[root@localhost ~]# ls -lh linuxdoc.txt
-rw-r--r-- 1 root root 100 04-27 15:56 linuxdoc.txt
[root@localhost ~]# more linuxdoc.txt
111111111
222222222
333333333
444444444
555555555
666666666
777777777
888888888
999999999
000000000
[root@localhost ~]# split -b 30 linuxdoc.txt linuxdocwsp 如果指定切分体积大小后面没有接单位,默认是B;
[root@localhost ~]# 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
[root@localhost ~]# more linuxdocwspa*
::::::::::::::
linuxdocwspaa
::::::::::::::
111111111
222222222
333333333
::::::::::::::
linuxdocwspab
::::::::::::::
444444444
555555555
666666666
::::::::::::::
linuxdocwspac
::::::::::::::
777777777
888888888
999999999
::::::::::::::
linuxdocwspad
::::::::::::::
000000000
对于切分体积的说明:如果没有指定单位,默认单位是B。还有其它的单位,比如b、k、m。看下面的例子;
[root@localhost ~]# ls -lh moretool.txt
-rw-r--r-- 1 root root 13K 04-27 16:17 moretool.txt 注:文件大小为13K;
[root@localhost ~]#split -b 3k moretool.txt moretoolwsp 注: 切分后每个文件大小为3K;
实例三:从标准输入读取的实例;
[root@localhost ~]# ls -lh /etc ' split -l 40 - etcfilelist
[root@localhost ~]# ls etcfilelista*
etcfilelistaa etcfilelistab etcfilelistac etcfilelistad etcfilelistae etcfilelistaf etcfilelistag
注:本指令的意思是用ls以长格式列出/etc目录的文件(不包括.file格式的文件,也就是隐藏文件),把输入的内容传递给split,让split来切分每40行为存为一个文件,文件名的开头以etcfilelist开始。注意40后面的- ,表示从标准输入读取,在这里就表示键盘输入了,也就是读取ls -lh /etc 指令的内容。然后split切分。
2.2 csplit 工具;
2.21语法
csplit [ -f Prefix ] [ -k ] [ -n Number ] [ -s ] File Argument ...
2.22描述
csplit 命令拷贝指定的文件并将拷贝分成段。 原始的还未改变的输入文件,必须是一个文本文件。
这个 csplit 命令将这些段写到文件 xx00 . . . xx99 中,这依赖于 Argument 参数 被指定(99 是最大值)多少次。缺省情况下,Argument 参数期望一个行号。当指定多行号时应用以下规则:
文件 xx00 包含原始文件的行开始,到(但不包括)第一个 Argument 参数指定的行。
文件 xx01 包含 第一个 Argument参数指定的编号的行开始,直到(但不包括)第二个 Argument参数引用的行。每个指定行号作为自变量,标记新行的开始。
文件 xxnn(最后创建的文件)包含最后一个 Argument 参数指定的编号的行开始,直到文件结束。
示例,如果原始的文件有 108 行,输入:
csplit orginal.txt 11 72 98
这个 csplit 命令创建 4 个文件: xx00 文件包含行 1-10,xx01 文件包含行 11-71,xx02 文件包含行 72-97,xx03 文件 包含行 98-108。
Argument 参数还可以包含以下符号和模式字符串:
/Pattern/ 创建一个文件包含从当前行开始直到(但不包含)包含指定模式的那一行的段的文件。包含模式的行成为当前行。
% Pattern % 使包含指定模式的行成为当前行,但不为段创建一个文件。
+ Number 将指定编号的行从以前的匹配模式前移。示例,/页 /+5 搜索页,那就提前 5 行。
-Number 将指定的行号从以前的匹配模式行后移。示例,/页 /-5 搜索页那就后退 5 行。
{Number} 重复指定次数的以前选项。这个号码可以紧跟任何模式或行号。如果紧跟一个模式,csplit 命令就会重新使用指定次数的模式。如果紧跟一个行号,csplit 命令 将文件从由行号指定行的点处分割开。
将引用标记放在所有模式周围,这些模式包含空格或其它专用于 shell 的字符。模式不要包含 embedded 新行字符。在表达中,例如 [a-z],- (减号)意思是通过,这是根据当前的整理顺序。一个整理顺序可以定义同等的类以便在字符范围以内使用。
2.23选项
-fPrefix 指定前缀由已经创建的文件段使用。此变量的缺省值是 xx。
-k 使创建的文件段完整的位于出错事件中。
-nNumber 改变十进制号码位,用于创建文件名。 缺省的是两个十进制位或 xx00 . . . xx99。 如果指定 -n 4 标志,例如,新的文件被命名为 xx0000 . . . xx0099。
-s 消除字符计数的显示。
退出状态
此命令返回以下退出值:
0 成功完成。
>0 发生错误。
2.24示例
将 book 的文本以每章一个单独文件来分割,输入:
csplit book "/^ Chapter *[k.0-9]k./" {9}
这创建了 10 个文件,从 xx00 到 xx09。xx00 文件包含了第一章前面的出版前页。文件从 xx01 到 xx09 包含各个单独的章节。每一章起始的一行只包含单词章和章节号。
为这些创建自 book 的文件指定前缀 chap,输入:
csplit -f chap book "/^ Chapter *[k.0-9]k./" {9}
这样把 book 分割成文件,命名从 chap00 到 chap09。
3、文件的连接工具 cat;
cat 工具如果后面直接文件文件名,就可以查看文件的内容。我们在《文件内容查看工具》中有说过。在《文件内容查看工具》一文中,我们也谈过cat 连接文件的功能;现在我们仍得把cat工具连接文件的功能单列出来说一说。
3.1 把多个文件合并到一个新的文件中;
命令格式如下:
cat file1 file2 file3 ... ... > filen
我们可以把file1、file2、file3 等多个文件合并到一个文件中,其中filen是在合并这些文件的同时新建的文件,而不是已存在的文件;
[root@localhost ~]# cat sir01.txt
123456
[root@localhost ~]# cat sir02.txt
56789
[root@localhost ~]# cat sir03.txt
09876
[root@localhost ~]# cat sir01.txt sir02.txt sir03.txt > sir04.txt
[root@localhost ~]# more sir04.txt
123456
56789
09876
3.2 把多个文件合并追加到一个已存在的文件中;
命令格式如下:
cat file1 file2 file3 ... ... >> filen
如果我们想把file1、file2、file3等多个文件内容连接起来,并追加到一个已存在的文件filen中,应该用追加的方法;
[root@localhost ~]# more sir01.txt
123456
[root@localhost ~]# cat sir01.txt
123456
[root@localhost ~]# cat sir02.txt
56789
[root@localhost ~]# cat sir03.txt
09876
[root@localhost ~]# cat sir05.txt
aaaaa
bbbbb
[root@localhost ~]# cat sir01.txt sir02.txt sir03.txt >> sir05.txt
[root@localhost ~]# cat sir05.txt
aaaaa
bbbbb
123456
56789
09876
4、关于分拆文件和连接文件的安全性;
比如我们把一个大的文件分拆为多个小文件时,肯定会考虑到,我们重新把一个一个小的分拆文件连接起来,会不会能和原文件保持一致 。这样的疑问其实也是有道理的,因为这关系到一个文件的完整性,如果真的合并不到一起,关系到文件的完整性和安全性。这时就涉及到文件的校验工具。一般我们是通过MD5工具来校验对比。在Linux也有这样的工具md5sum。
[root@localhost ~]# ls -lh myfile.img 注:查看myfile.img文件属性;
-rw-r--r-- 1 root root 7.9M 04-27 20:35 myfile.img
[root@localhost ~]# split -b 4m myfile.img myfileSp 注:分拆为大小为4M的文件;
[root@localhost ~]# 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
[root@localhost ~]# cat myfileSp* > newmyfile.img 注:我们尝试合并文件到一个新文件中;
[root@localhost ~]# ls -lh newmyfile.img
-rw-r--r-- 1 root root 7.9M 04-27 20:38 newmyfile.img
[root@localhost ~]# md5sum newmyfile.img myfile.img 注:我们对比合并后文件和原文件的MD5值,如果M55值相同,就是完整的;
[root@localhost ~]# md5sum newmyfile.img myfile.img
7eb24d865a14fa3227633816800522c1 myfile.img
7eb24d865a14fa3227633816800522c1 newmyfile.img
上面是一个实例,把myfile.img文件分拆为4M大小的文件,然后再把两个文件连接起来,然后校验是不是合并后的文件和原文件的MD5值是相同的,如果相同,证明分拆过程是安全的。

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,切分后,每两行存为一个新文件。 [root@localhost ~]# more linuxdoc.txt 注:linuxdoc.txt 文件内容查看;111111111222222222333333333444444444555555555666666666777777777888888888999999999000000000[root@localhost ~]# split -l 2 linuxdoc.txt linuxdocsp 注:切分linuxdoc.txt文件,被切分后的文件名linuxdocsp开头[root@localhost ~]# ls linuxdocspa* 注:查看切分后的所有文件;linuxdocspaa linuxdocspab linuxdocspac linuxdocspad linuxdocspae[root@localhost ~]# more linuxdocspa* 注:查看这些文件的内容;是不是每个文件都是两行呢?linuxdocspaa::::::::::::::111111111222222222::::::::::::::linuxdocspab::::::::::::::333333333444444444::::::::::::::linuxdocspac::::::::::::::555555555666666666::::::::::::::linuxdocspad::::::::::::::777777777888888888::::::::::::::linuxdocspae::::::::::::::999999999000000000 实例二:以文件体积为单位的切分; [root@localhost ~]# ls -lh linuxdoc.txt-rw-r–r– 1 root root 100 04-27 15:56 linuxdoc.txt[root@localhost ~]# more linuxdoc.txt111111111222222222333333333444444444555555555666666666777777777888888888999999999000000000[root@localhost ~]# split -b 30 linuxdoc.txt linuxdocwsp 如果指定切分体积大小后面没有接单位,默认是B;[root@localhost ~]# 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[root@localhost ~]# more linuxdocwspa::::::::::::::linuxdocwspaa::::::::::::::111111111222222222333333333::::::::::::::linuxdocwspab::::::::::::::444444444555555555666666666::::::::::::::linuxdocwspac::::::::::::::777777777888888888999999999::::::::::::::linuxdocwspad::::::::::::::000000000 对于切分体积的说明:如果没有指定单位,默认单位是B。还有其它的单位,比如b、k、m。看下面的例子; [root@localhost ~]# ls -lh moretool.txt-rw-r–r– 1 root root 13K 04-27 16:17 moretool.txt 注:文件大小为13K;[root@localhost ~]#split -b 3k moretool.txt moretoolwsp 注: 切分后每个文件大小为3K; 实例三:从标准输入读取的实例; [root@localhost ~]# ls -lh /etc ‘ split -l 40 - etcfilelist[root@localhost ~]# ls etcfilelista*etcfilelistaa etcfilelistab etcfilelistac etcfilelistad etcfilelistae etcfilelistaf etcfilelistag 注:本指令的意思是用ls以长格式列出/etc目录的文件(不包括.file格式的文件,也就是隐藏文件),把输入的内容传递给split,让split来切分每40行为存为一个文件,文件名的开头以etcfilelist开始。注意40后面的- ,表示从标准输入读取,在这里就表示键盘输入了,也就是读取ls -lh /etc 指令的内容。然后split切分。

2.2 csplit 工具; 2.21语法csplit [ -f Prefix ] [ -k ] [ -n Number ] [ -s ] File Argument … 2.22描述csplit 命令拷贝指定的文件并将拷贝分成段。 原始的还未改变的输入文件,必须是一个文本文件。 这个 csplit 命令将这些段写到文件 xx00 . . . xx99 中,这依赖于 Argument 参数 被指定(99 是最大值)多少次。缺省情况下,Argument 参数期望一个行号。当指定多行号时应用以下规则: 文件 xx00 包含原始文件的行开始,到(但不包括)第一个 Argument 参数指定的行。文件 xx01 包含 第一个 Argument参数指定的编号的行开始,直到(但不包括)第二个 Argument参数引用的行。每个指定行号作为自变量,标记新行的开始。文件 xxnn(最后创建的文件)包含最后一个 Argument 参数指定的编号的行开始,直到文件结束。示例,如果原始的文件有 108 行,输入: csplit orginal.txt 11 72 98这个 csplit 命令创建 4 个文件: xx00 文件包含行 1-10,xx01 文件包含行 11-71,xx02 文件包含行 72-97,xx03 文件 包含行 98-108。 Argument 参数还可以包含以下符号和模式字符串:/Pattern/ 创建一个文件包含从当前行开始直到(但不包含)包含指定模式的那一行的段的文件。包含模式的行成为当前行。% Pattern % 使包含指定模式的行成为当前行,但不为段创建一个文件。+ Number 将指定编号的行从以前的匹配模式前移。示例,/页 /+5 搜索页,那就提前 5 行。-Number 将指定的行号从以前的匹配模式行后移。示例,/页 /-5 搜索页那就后退 5 行。{Number} 重复指定次数的以前选项。这个号码可以紧跟任何模式或行号。如果紧跟一个模式,csplit 命令就会重新使用指定次数的模式。如果紧跟一个行号,csplit 命令 将文件从由行号指定行的点处分割开。将引用标记放在所有模式周围,这些模式包含空格或其它专用于 shell 的字符。模式不要包含 embedded 新行字符。在表达中,例如 [a-z],- (减号)意思是通过,这是根据当前的整理顺序。一个整理顺序可以定义同等的类以便在字符范围以内使用。 2.23选项-fPrefix 指定前缀由已经创建的文件段使用。此变量的缺省值是 xx。-k 使创建的文件段完整的位于出错事件中。-nNumber 改变十进制号码位,用于创建文件名。 缺省的是两个十进制位或 xx00 . . . xx99。 如果指定 -n 4 标志,例如,新的文件被命名为 xx0000 . . . xx0099。-s 消除字符计数的显示。退出状态 此命令返回以下退出值: 0 成功完成。>0 发生错误。 2.24示例将 book 的文本以每章一个单独文件来分割,输入: csplit book “/^ Chapter *[k.0-9]k./” {9}这创建了 10 个文件,从 xx00 到 xx09。xx00 文件包含了第一章前面的出版前页。文件从 xx01 到 xx09 包含各个单独的章节。每一章起始的一行只包含单词章和章节号。 为这些创建自 book 的文件指定前缀 chap,输入:csplit -f chap book “/^ Chapter *[k.0-9]k./” {9}这样把 book 分割成文件,命名从 chap00 到 chap09。 3、文件的连接工具 cat; cat 工具如果后面直接文件文件名,就可以查看文件的内容。我们在《文件内容查看工具》中有说过。在《文件内容查看工具》一文中,我们也谈过cat 连接文件的功能;现在我们仍得把cat工具连接文件的功能单列出来说一说。

3.1 把多个文件合并到一个新的文件中; 命令格式如下: cat file1 file2 file3 … … > filen 我们可以把file1、file2、file3 等多个文件合并到一个文件中,其中filen是在合并这些文件的同时新建的文件,而不是已存在的文件; [root@localhost ~]# cat sir01.txt123456[root@localhost ~]# cat sir02.txt56789[root@localhost ~]# cat sir03.txt09876[root@localhost ~]# cat sir01.txt sir02.txt sir03.txt > sir04.txt[root@localhost ~]# more sir04.txt1234565678909876

3.2 把多个文件合并追加到一个已存在的文件中; 命令格式如下: cat file1 file2 file3 … … » filen 如果我们想把file1、file2、file3等多个文件内容连接起来,并追加到一个已存在的文件filen中,应该用追加的方法; [root@localhost ~]# more sir01.txt123456[root@localhost ~]# cat sir01.txt123456[root@localhost ~]# cat sir02.txt56789[root@localhost ~]# cat sir03.txt09876[root@localhost ~]# cat sir05.txtaaaaabbbbb[root@localhost ~]# cat sir01.txt sir02.txt sir03.txt » sir05.txt[root@localhost ~]# cat sir05.txtaaaaabbbbb1234565678909876

4、关于分拆文件和连接文件的安全性; 比如我们把一个大的文件分拆为多个小文件时,肯定会考虑到,我们重新把一个一个小的分拆文件连接起来,会不会能和原文件保持一致 。这样的疑问其实也是有道理的,因为这关系到一个文件的完整性,如果真的合并不到一起,关系到文件的完整性和安全性。这时就涉及到文件的校验工具。一般我们是通过MD5工具来校验对比。在Linux也有这样的工具md5sum。 [root@localhost ~]# ls -lh myfile.img 注:查看myfile.img文件属性;-rw-r–r– 1 root root 7.9M 04-27 20:35 myfile.img[root@localhost ~]# split -b 4m myfile.img myfileSp 注:分拆为大小为4M的文件;[root@localhost ~]# 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[root@localhost ~]# cat myfileSp* > newmyfile.img 注:我们尝试合并文件到一个新文件中;[root@localhost ~]# ls -lh newmyfile.img-rw-r–r– 1 root root 7.9M 04-27 20:38 newmyfile.img[root@localhost ~]# md5sum newmyfile.img myfile.img 注:我们对比合并后文件和原文件的MD5值,如果M55值相同,就是完整的;[root@localhost ~]# md5sum newmyfile.img myfile.img7eb24d865a14fa3227633816800522c1 myfile.img7eb24d865a14fa3227633816800522c1 newmyfile.img 上面是一个实例,把myfile.img文件分拆为4M大小的文件,然后再把两个文件连接起来,然后校验是不是合并后的文件和原文件的MD5值是相同的,如果相同,证明分拆过程是安全的。