当前位置: 首页 > 科技观察

Linux下如何剪切合并大文件

时间:2023-03-11 20:30:54 科技观察

我们在传输大文件时,有时网络速度慢,需要很长时间才能完成传输,或者传输过程中网络不稳定,都可能导致传输失败。这种情况下,我们可以把大文件分割成小文件,一个一个传输到目的地,最后合并成一个文件。小文件传输有什么优势?当突然断网,传输失败时,只需要重新传输失败的文件即可。由于文件比较小,所以重传一个比较大的文件会快很多。另外,切割成小文件可以增加传输的并发度,也就是说同时传输多个小文件,比传输单个文件要快。linux下剪切文件的命令是split,合并文件可以用cat命令。下面将介绍这两个命令的使用和切割处理合并文件的方法语法split命令的语法如下:表示大文件拆分后生成的小文件名的前缀,默认为小写字母x,前缀后跟一组字符,文件名按照字母顺序一个接一个组成aa、ab和ac。例如:切割成三个文件,它们的文件名默认为xaa、xab、xacOPTION表示命令的选项,例如:bywordCuttingfilesbysections,splittingfilesbyfilelines等,一些常用的选项有下面列出来切割文件。让我们看一些使用split命令的例子。按文件大小裁剪首先创建一个10M的文件。关于如何创建一个指定大小的文件文件可以参考1s创建一个100G的文件。最快的方法是?[root@localhostsplit_test]#fallocate-l10Mmyfile[root@localhostsplit_test]#ls-lhTotalusage10M-rw-r--r--1rootroot10M9月3011:18myfile[root@localhostsplit_test]#将myfile文件拆分成几个小文件,每个文件大小为2M[root@localhostsplit_test]#split-b2Mmyfile[root@localhostsplit_test]#ls-lhTotalusage20M-rw-r--r--1rootroot10M93011:18myfile-rw-r--r--1rootroot2.0M93011:23xaa-rw-r--r--1rootroot2.0M93011:23xab-rw-r--r--1rootroot2.0M3011年9月:23xac-rw-r--r--1rootroot2.0M3011年9月:23xad-rw-r--r--1rootroot2.0M3011年9月:23xaefrom从上面的结果可以看出输入文件myfile的大小是10M,选项“-b2M”表示每个输出文件都是2M,一共被切割成5个文件,文件名称分别为xaa、xab、xac、xad、xae。根据文件行数切割首先创建一个10K的文件,文件的每一行都是“thisisatestfile”[root@localhostsplit_test]#yes“thisisatestfile”|head-c10K>numfile[root@localhostsplit_test]#ls-lhtotalusage12K-rw-r--r--1rootroot10KSeptember3011:46numfile[root@localhostsplit_test]#wc-lnumfile512numfile从结果可以知道numfile文件的大小为10K,共有512个总行数。命令wc-lnumfile是查询numfile文件的总行数,将numfile文件分割成若干个文件,每个文件100行,新生成的文件名以“split_file_”为前缀。具体命令及执行结果如下:[root@localhostsplit_test]#split-l100numfilesplit_file_[root@localhostsplit_test]#ls-lhtotalusage36K-rw-r--r--1rootroot10KSeptember3011:46numfile-rw-r--r--1rootroot2.0KSeptember3011:54split_file_aa-rw-r--r--1rootroot2.0K9Sep3011:54split_file_ab-rw-r--r--1rootroot2.0KSep3011:54split_file_ac-rw-r--r--1rootroot2.0K3011年9月:54split_file_ad-rw-r--r--1rootroot2.0K3011年9月:54split_file_ae-rw-r--r--1rootroot2403011年9月:54split_file_af[root@localhostsplit_test]#wc-lsplit_file_aa100split_file_aa[root@localhostsplit_test]#wc-lsplit_file_ab100plit[root_filec-lsplit_file_ac100split_file_ac[root@localhostsplit_test]#wc-lsplit_file_ad100split_file_ad[root@localhostsplit_test]#wc-lsplit_file_ae100split_file_ae[root@localhostsplit_test]#wc-lsplit_file_af12split_file_af一共分为6个file_6个文件,从结果中我们知道有6个文件分别是split_file_aa、split_file_ab、split_file_ac、split_file_ad、split_file_ae、split_file_af,前5个文件各100行,最后一个文件只有剩下的12行。选项-n可以控制文件按照文件个数被切割成小文件。文件数[root@localhostsplit_test]#fallocate-l5Mcntfile[root@localhostsplit_test]#ls-lh总用量5.0M-rw-r--r--1rootroot5.0MSeptember3012:51cntfile[root@localhostsplit_test]#split-d-n5cntfile[root@localhostsplit_test]#ls-lh总使用量10M-rw-r--r--1rootroot5.0MSeptember3012:51cntfile-rw-r--r--1rootroot1.0MSeptember3012:58x00-rw-r--r--1rootroot1.0M9月3012:58x01-rw-r--r--1rootroot1.0MSeptember3012:58x02-rw-r--r--1rootroot1.0MSeptember3012:58x03-rw-r--r--1rootroot1.0MSeptember3012:58x04fallocate-l5Mcntfile命令是创建一个5M的文件cntfilesplit-d-n5cntfile命令是把cntfile文件分割成5个小文件,-d选项表示文件名使用数字后缀,从分割后的结果可以知道,cutting最后生成了5个文件,分别是x00,x01,x02,x03,x04,每个文件的大小为1M。禁止生成长度为0的文件。在上面的小节中,有一种特殊情况,文件的大小不够,不能分成指定数量的小文件,例如:一个5字节的文件需要切割成8个文件,切割的最小单位是1字节,所以最多只能切割成5个文件,需要切割成8个文件的话,剩下3个文件的大小可以只有0个字节。即使生成了上述的空文件,也是没有意义的。我们可以使用-e选项来禁止生成空文件。请看下图例子fallocate-l5testfile表示创建一个大小为5字节的文件testfilesplit--verbose-n8testfile表示将testfile分成8个小文件,--verbose选项为输出创建新文件的日志。从上图可以看出,执行命令后,一共创建了8个文件,分别是xaa,xab,xac,xad,xae,xaf,xag,xah,每个文件的大小是多少,继续见下图中的ls-lh命令的结果输出了切割后每个文件的详细信息,从中可以得出前五个文件(xaa、xab、xac、xad、xae)的大小为1字节,最后三个文件就是图中红框内的文件(xaf,xag,xah)都是0字节大小。0字节文件不包含任何内容,不需要传输,所以不需要生成。我们可以使用-e选项来禁止0字节文件的生成,我们先删除切割后的小文件,然后执行split--verbose-e-n8testfile命令,具体结果如下:从上图可以看出,加上-e选项后,只生成了5个文件,分别是xaa、xab、xac、xad、xae,每个文件大小为1字节,不出现0字节大小的文件,需要剪切合并。大文件被切割成许多小文件。它们都通过网络传输到远程机器后,需要合并成一个大文件,合并后的大文件和原来的大文件是一模一样的,下面用一个例子来说明整个过程1.在本地生成一个1G的文件[root@localhostsplit_test]#ddif=/dev/urandomof=bigfilebs=1Mcount=1024条记录1024+0条读入记录1024+0条写出1073741824bytes(1.1GB)copied,87.5173sec,12.3MB/sec[root@localhostsplit_test]#ls-lhtotalusage1.0G-rw-r--r--1rootroot1.0GSeptember3014:41bigfile2,计算本地文件的MD5bigfile,并用它来验证远程机器上的大文件2.0G-rw-r--r--1rootroot1.0GSeptember3014:41bigfile-rw-r--r--1rootroot100MSeptember3014:44xaa-rw-r--r--1rootroot100MSep3014:44xab-rw-r--r--1rootroot100M3014年9月:44xac-rw-r--r--1rootroot100M3014年9月:44xad-rw-r--r--1rootroot100M3014年9月:44xae-rw-r--r--1rootroot100MSep3014:44xaf-rw-r--r--1rootroot100MSep3014:44xag-rw-r--r--1rootroot100MSep3014:44xah-rw-r--r--1rootroot100MSeptember3014:44xai-rw-r--r--1rootroot100MSeptember3014:44xaj-rw-r--r--1rootroot24MSeptember3014:44xak4,切割文件后Xa、Xab、Xac、Xad、Xae、Xaf、Xag、Xah、Xai、Xaj、Xak一一传送到远程机器的merge_test目录下,这里省略传送过程。5.进入远程机器的merge_test目录,将合并后的文件[root@localhostmerge_test]#catx*>remote_bigfile[root]合并成一个文件@localhostmerge_test]#ls-lhtotalusage2.0G-rw-r--r--1rootroot1.0Gsep3014:54remote_bigfile-rw-r--r--1rootroot100Msep3014:53xaa-rw-r--r--1rootroot100Msep3014:53xab-;rw-r--r--1rootroot100MSep3014:53xac-rw-r--r--1rootroot100MSep3014:53xad-rw-r--r--1rootroot100MSep3014:53xae-rw-r--r--1rootroot100MSep3014:53xae-rw-r--r--1rootroot100MSep53xaf-rw-r--r--1rootroot100MSep3014:53xag-rw-r--r--1rootroot100MSep3014:53xah-rw-r--r--1rootroot100MSep3014:53xai-rw-r--r--1rootroot100MSep3014:53xaj-rw-r--r--1rootroot24MSeptember3014:53xak6,计算合并后的remote_bigfile文件的MD5[root@localhostmerge_test]#md5sumremote_bigfile4b06ddf4eeecbf26f36fd3ddad331debremote_bigfile7;如果文件的MD5和远程机器上的remote_bigfile文件的MD5相同,则传输成功;如果不是,则传输失败。根据第2步和第6步的结果,bigfile和remote_bigfile的MD5都是4b06ddf4eeecbf26f36fd3ddad331deb,所以本文介绍这次成功传输的总结文件切割命令的用法,以及切割的整个过程,传输、合并、验证,本文示例中使用的fallocate、dd、yes创建文件的使用,可参考1s创建100G文件。最快的方法是什么?