前言

当需要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,往往会因为网络或其它原因而导致传输中断而不得不重新传输。这种情况下,可以先将大文件分割成小文件后分批传输,传完后再合并文件。

分割文件

文件分割可以使用 split 命令,该命令既支持文本文件分割,又支持二进制文件分割;而合并文件可以使用 cat 命令。

文本文件分割

分割文本文件时,可以按文件大小分割,也可以按文本行数分割。

按文件大小分割

按文件大小分割文件时,需要以 -C 参数指定分割后的文件大小:

1
split -C 100M large_file.txt stxt

如上所示,我们将大文件 large_file.txt 按 100M 大小进行分割,并指定了分割后文件前缀 stxt;当不指定前缀时,split 会自动对分割文件进行命名,一般会以 x 开头。

按行分割

文本文件还可以以行为单位进行分割,以行数进行分割时会忽略文件大小,并以 -l 参数指定分割后文件的行数:

1
split -l 1000 large_file.txt stxt

二进制文件分割

二进制文件分割类似于按大小分割文本文件,不同的是以 -b 参数来指定分割后的文件大小:

1
split -b 100M data.bak sdata

文件合并

文件合并使用 cat 命令,上面几种方式分割的文件都可以使用 cat 命令合并。

cat 命令合并分割文件:

1
cat stxt* > new_file.txt

命令格式

split 命令说明

split 命令格式如下:

1
split [选项]… [要切割的文件 [输出文件前缀]]

命令参数:

  • -a, --suffix-length=N:使用长度为 N 的后缀(默认 2)
  • -b, --bytes=SIZE:设置输出文件的大小。支持单位:m, k
  • -C, --line-bytes=SIZE:设置输出文件的最大行数。与 -b 类似,但会尽量维持每行的完整性
  • -d, --numeric-suffixes:使用数字后缀代替字母
  • -l, --lines=NUMBER:设置输出文件的行数
  • --help:显示帮助信息
  • --version:输出版本信息

cat 命令说明

cat 是 Linux 下使用频率较高的命令之一。

cat 连接文件并打印到标准输出设备上。

cat 命令的常见使用场景有:

显示文件内容:

1
cat filename

创建一个空文件:

1
cat > filename

文件合并:

1
cat file1 file2 > file

分割二进制文件

使用 split 命令,-b 4000M 表示设置每个分割包的大小,单位还可以是 k-d 参数指定生成的分割包后缀为数字的形式。-a x 来设定序列的长度(默认值是 2),这里设定序列的长度为 1。

1
split -b 4000M -d -a 1 cm-11.tar.gz cm-11.tar.gz.

执行命令后,生成压缩包如下:

1
2
3
4
5
6
7
8
-rw-r--r--  1 root   root    4194304000 May 20 14:00 cm-11.tar.gz.0
-rw-r--r-- 1 root root 4194304000 May 20 14:02 cm-11.tar.gz.1
-rw-r--r-- 1 root root 4194304000 May 20 14:03 cm-11.tar.gz.2
-rw-r--r-- 1 root root 4194304000 May 20 14:05 cm-11.tar.gz.3
-rw-r--r-- 1 root root 4194304000 May 20 14:06 cm-11.tar.gz.4
-rw-r--r-- 1 root root 4194304000 May 20 14:08 cm-11.tar.gz.5
-rw-r--r-- 1 root root 4194304000 May 20 14:09 cm-11.tar.gz.6
-rw-r--r-- 1 root root 2256379886 May 20 14:10 cm-11.tar.gz.7

解压命令和分割命令合并成一步来执行

采用管道,其中 - 参数表示将所创建的文件输出到标准输出上:

1
tar -zcvf cm-11.tar.gz cm-11 | split -b 4000M -d -a 1 - cm-11.tar.gz.

分割后的压缩包解压命令如下

1
cat cm-11.tar.gz.* | tar -zxv