处理和传输大文件,以及处理和传输大量小文件一直很有挑战。特别是在多个存储介质,以及网络之间传输的时候。大文件无法放入一张4.7G的光盘当中;大量小文件传输需要系统打开非常多文件描述符,会造成资源浪费的情况。
本文介绍如何应对这两种情况,使用文件分割、文件压缩以及压缩时分割的方法处理文件,然后如何还原分割后的文件。
分割文件
在Linux下分割文件最常用的方法之一是使用split
命令。split
命令可以按固定大小分割,还可以按分割后的数量进行分割
假如我们有一个50M的文件,我们需要把它分成5个10M的部分:
1
2
3
4
5
6
7
8
|
# 使用dd命令创建一个50M的test.txt文件
dd if=/dev/zero of=test.txt bs=50M count=1
# 可以看到文件创建成功了
# $ls -alth test.txt
# -rw-r--r-- 1 Kevin None 50M Sep 14 10:34 test.txt
split -b 10M test.txt test_
|
上面的split
命令把50M的test.txt文件拆成了5个以 test_ 开头的10M大小的文件,查看分割后的文件列表:
1
2
3
4
5
6
|
$ ls -alth test_*
-rw-r--r-- 1 Kevin None 10M Sep 14 10:36 test_ae
-rw-r--r-- 1 Kevin None 10M Sep 14 10:36 test_ab
-rw-r--r-- 1 Kevin None 10M Sep 14 10:36 test_ac
-rw-r--r-- 1 Kevin None 10M Sep 14 10:36 test_ad
-rw-r--r-- 1 Kevin None 10M Sep 14 10:36 test_aa
|
解释一下split
命令
把文件拆分成参数指定的大小,默认输出为 PREFIXaa,PREFIXab 格式,默认以 aa, ab, ac 来创建不同的文件名。命令的格式如下:
1
|
split [OPTION]... [FILE [PREFIX]]
|
-b
或者 --bytes
参数指定生成分割后的文件大小,可以使用 K,M,G,T,P,E,Z,Y (1024的倍数)为单位进行指定,或者 KB,MB,… (这是1000的倍数)。
-d
参数指定使用数字方式生成文件,例如 test_01, test_02
还可以按分割后的文件数量进行分割:
1
|
split -d -n 3 test.txt test_
|
分割后
1
2
3
4
|
$ ls -alth test_*
-rw-r--r-- 1 Kevin None 17M Sep 14 10:57 test_02
-rw-r--r-- 1 Kevin None 17M Sep 14 10:57 test_01
-rw-r--r-- 1 Kevin None 17M Sep 14 10:57 test_00
|
合并文件
使用命令cat就可以把分割的多个文件进行合并了
1
|
cat test_* > another_test.txt
|
查看合并后的文件
1
2
3
4
5
6
7
8
9
|
$ ls -alth another_test.txt
-rw-r--r-- 1 Kevin None 50M Sep 14 10:59 another_test.txt
# 使用md5sum验证文件内容
$ md5sum test.txt
25e317773f308e446cc84c503a6d1f85 *test.txt
$ md5sum another_test.txt
25e317773f308e446cc84c503a6d1f85 *another_test.txt
|
使用zip在压缩的时候同时进行分割
zip命令是Linux中的一个命令行工具,它允许我们创建文件和目录的存档。除此之外,它还提供了许多用于操作归档的功能。
安装
要在Ubuntu/Debian中安装zip命令行工具,我们可以使用包管理器apt-get(或者apt):
1
2
|
$ sudo apt-get update
$ sudo apt-get install -y zip
|
此外,我们可以使用软件包管理器yum在基于RHEL的Linux中安装zip命令行工具:
1
2
|
$ sudo yum update
$ sudo yum install -y zip
|
zip命令语法格式:
1
|
zip [options] [zipfile [files...]] [-xi list]
|
基础用法:
1
2
3
|
$ zip test.zip test_001.txt test_002.txt
adding: test_001.txt (deflated 100%)
adding: test_002.txt (deflated 100%)
|
重点来了,在使用zip归档和压缩文件的时候,同时把归档的文件进行分割,这时需要使用到-s
参数,意思就是使用split命令进行分割
1
2
3
|
$ zip -s 200M test.zip redis-6.2.6.tar neo4j-4.4.15.tar
adding: redis-6.2.6.tar (deflated 66%)
adding: neo4j-4.4.15.tar (deflated 37%)
|
查看归档及分割后的文件列表
1
2
3
|
$ ls -alth test.*
-rw-r--r-- 1 Kevin None 185M Sep 14 11:14 test.zip
-rw-r--r-- 1 Kevin None 200M Sep 14 11:13 test.z01
|
解压分割后的文件
首先把多个文件合并成一个zip文件
1
|
zip -FF test.zip --out test_single.zip
|
然后使用unzip命令进行解压
1
|
unzip test_single.zip -d ./temp
|
总结
在本文中,我们学习了将文件拆分为多个部分,然后将各个部分重新连接在一起。接下来,我们描述了如何应用流行的压缩实用程序zip和unzip来处理拆分的归档。
公众号
欢迎关注我的公众号,同步更新