【📚推荐阅读】
📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师
🏆 近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者、腾讯云TDP-KOL、ACDU成员、墨天轮技术专家博主
🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~
引言
分割文件场景很常见,尤其是在日志解析或者查阅日志信息时。在我们日常的工作中,传输文件很常见,在进行文件传输的过程中,因为网络传输速率和文件内容大小的限制,经常会遇到文件传输失败的情况。针对文件传输失败的情况。大文件由于其传输时间长,一旦传输失败,重新传输费时且不一定能保证再次传输成功。针对这种情况,可以考虑将文件分割成小文件的方式进行传输,减少因传输失败或传输大小限制导致的问题。本文就是讲述如何拆分文件后再进行传输,可提升在工作中的效率。
split使用场景
● 分割文本,在有些语言中可分割字符串、分割文本、分割视频等
● 分割日志文件,协助运维同事排查日志报错等
● 分割后备份文件,用于增量存储数据等
● 处理大型数据集文件等
前期准备
主要是macOS操作系统,如果不常使用,可以直接参看Linux中的split。
【测试文件信息】
此处我这里准备一个测试文件test**.sql
,31886行
,大小 24083097 字节
(大约 24.1MB,此处为了方便后续测试使用)。文件信息如下:
语法帮助
在MacOS上使用split就更舒服了,应该是更简单、简洁、简便了。同样使用 --help 命令来查看帮助命令(其实,在macOS这里,可以使用 -h, --h, -he,-hel ,–he 等等不规则的来查询帮助,其实是一些错误的命令)。
Aion@Macbook ~ $ split --help
split: illegal option -- -
usage: split [-l line_count] [-a suffix_length] [file [prefix]]
split -b byte_count[K|k|M|m|G|g] [-a suffix_length] [file [prefix]]
split -n chunk_count [-a suffix_length] [file [prefix]]
split -p pattern [-a suffix_length] [file [prefix]]
Aion@Macbook ~ $
在MacOS的命令中,有四种分割情况,分别是按行数量分割
、按字节数量分割
、按块或组数量分割
、按模式/方式分割
,其中默认的分割方式为按行数量分割。无论是哪一种分割方式,格式统一为如下方式:
split [分割方式] [新文件前缀长度/深度] [需要被分割的文件/文件路径 [新文件前缀名称]]
1 按行数量分割
【实践】
将一个大文件切分成多个小文件,每个小文件包含指定数量的行。此处我按照 1000行为一个目标文件来分割,由于每一个行的大小不等,所以分割出来的每一个文件大小也会不等,这个毋庸置疑。分割后的文件用 test_lc_ 来标识,以区分源文件。
Aion@Macbook split-test $ split -l 1000 test01.sql test_lc_
Aion@Macbook split-test $ ls
test-all.sql test_lc_ab test_lc_af test_lc_aj test_lc_an test_lc_ar test_lc_av test_lc_az test_lc_bd
test.sql test_lc_ac test_lc_ag test_lc_ak test_lc_ao test_lc_as test_lc_aw test_lc_ba test_lc_be
test01.sql test_lc_ad test_lc_ah test_lc_al test_lc_ap test_lc_at test_lc_ax test_lc_bb test_lc_bf
test_lc_aa test_lc_ae test_lc_ai test_lc_am test_lc_aq test_lc_au test_lc_ay test_lc_bc
Aion@Macbook split-test $
【验证】
为了验证脚本执行的效果,下面看看被分割后的文件中的行数
Aion@Macbook split-test $ wc -l test_lc_*
1000 test_lc_aa
1000 test_lc_ab
1000 test_lc_ac
1000 test_lc_ad
1000 test_lc_ae
……此处省略多行
1000 test_lc_bb
1000 test_lc_bc
1000 test_lc_bd
1000 test_lc_be
886 test_lc_bf
31886 total
Aion@Macbook split-test $
从上面的结果来看,是按照约定的规则产生每个文件1000行。
注意⚠️:
总文件数量的计算规则为如下(这里说一下这个规则的意思在于后续的规则都大差不多,理解意思就可以了):
总行数 % 设定行数, 如果余数为 0 则 分割文件数 = 总行数 / 设定行数,取整数;
总行数 % 设定行数, 如果余数不为 0 则 分割文件数 = 总行数 / 设定行数 + 1,取整数。
2 按字节数量分割
将一个大文件切分成多个小文件,每个小文件包含固定大小(指的是文件字节大小)。此处我是按照新产生的文件为每个5M为大小进行分割,则产生5个文件。
Aion@Macbook split-test $ split -b 5M test02.sql test_bc_
Aion@Macbook split-test $ ll test_bc_*
-rw-r--r-- 1 Aion staff 5242880 11 14 18:58 test_bc_aa
-rw-r--r-- 1 Aion staff 5242880 11 14 18:58 test_bc_ab
-rw-r--r-- 1 Aion staff 5242880 11 14 18:58 test_bc_ac
-rw-r--r-- 1 Aion staff 5242880 11 14 18:58 test_bc_ad
-rw-r--r-- 1 Aion staff 3111577 11 14 18:58 test_bc_ae
Aion@Macbook split-test $
可选择的文件大小的单位有(不区分大小写) :
● KB:K|k,每个文件多少KB
● MB:M|m,每个文件多少MB
● GB:G|g,每个文件多少GB
3 按块或组数量分割
将一个大文件切分成多个小文件,按照固定的文件数量来分割。此处我想将test03.sql 分割为3个文件。
Aion@Macbook split-test $ split -n 3 test03.sql test_cc_
Aion@Macbook split-test $
Aion@Macbook split-test $ ll test_cc_*
-rw-r--r-- 1 Aion staff 8027699 11 14 19:05 test_cc_aa
-rw-r--r-- 1 Aion staff 8027699 11 14 19:05 test_cc_ab
-rw-r--r-- 1 Aion staff 8027699 11 14 19:05 test_cc_ac
Aion@Macbook split-test $
Aion@Macbook split-test $ ll test03.sql
-rw-r--r--@ 1 Aion staff 24083097 11 14 19:05 test03.sql
Aion@Macbook split-test $
由于此时从文件大小上正好可以分割为3个文件,所以也只能看到3个文件,chunk_count分割方法同 byte_count 分割方法可以理解为相互或者相向的。
4 按模式/方式/格式分割
-p是其中一个不太常用的选项,但在某些特定场景下可能很有用。-p 选项的作用是按每个输出文件的大小(默认是 1000 行)来分割文件,并且尽量保持每个分割后的文件包含完整的、未分割的行。也就是说,如果某一行的内容在分割点附近,那么这一行会完整地出现在某一个文件中,而不是被分割到两个文件中。
5 隐藏参数说明
一个很有意思的事情,其实我在写这篇笔记时,先在macOS上做的测试,一开始只是按照说明进行测试,后续又在 GUN/Linux 上面做了测试,发现多了一个隐藏的参数并没有在macOS里面的 --help 中说明,那就是 -d 参数。这一章节是后续补充的内容,也希望在学习或者实践时多留意下。
【含义】
这个参数的意思其实也很简单,如果你熟悉或做过正则表达式,那么就不会陌生了,他就是将文件的默认的 aa* 格式改为 00* 数字格式,通俗一些就是 将原来默认的 字母格式 修改为 数字格式。这也是产生文件的后缀类型。举例子可能更好理解:
原来默认情况下,产生的文件为下面的格式(默认两位数开始编码)
aa
ab
ac
ad
……
使用 -d 参数 后,产生的文件为下面的格式(默认两位数开始编码)
00
01
02
03
……
思考
在MacOS中使用split命令,参数不多,简单明了,可以快速针对文件进行分割操作。
总结
在我们日常的工作中,传输文件很常见,在进行文件传输的过程中,因为网络传输速率和文件内容大小的限制,经常会遇到文件传输失败的情况。针对文件传输失败的情况。大文件由于其传输时间长,一旦传输失败,重新传输费时且不一定能保证再次传输成功。针对这种情况,可以考虑将文件分割成小文件的方式进行传输,减少因传输失败或传输大小限制导致的问题。本文就是讲述如何拆分文件后再进行传输,可提升在工作中的效率。
欢迎关注博主 「六月暴雪飞梨花」 或加入【六月暴雪飞梨花社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。