在 Linux 系统中,tar 是最核心的归档(打包)工具,可结合压缩算法实现 “打包 + 压缩”;split 则用于将大文件分割为小文件,便于存储和传输。以下是两者的详细整理,包含核心功能、语法、选项及实操案例。

一、tar 工具:归档与压缩

tar(Tape ARchive,磁带归档)的核心功能是将多个文件 / 目录打包成单个归档文件(.tar),本身不具备压缩能力,但可通过参数调用 gzip/bzip2/xz 等工具实现压缩。其优势是能保留文件的权限、修改时间等属性,是 Linux 中最常用的备份工具。

1. 核心语法

tar 支持两种风格的参数写法(推荐使用 GNU 风格,更易读):


风格

核心语法(必选参数 + 选项)

UNIX 风格

`tar {A

c

d

r

t

u

x}[选项] [归档文件] [文件 / 目录...]`

GNU 风格

`tar {--catenate

--create

--diff

--append

--list

--update

--extract} [-- 选项] [归档文件]...`


关键说明


  • 必选参数(二选一):决定 tar 的核心操作(如创建、解压、列表);

  • -f [归档文件]:指定归档文件名,大多数操作必须包含此选项(否则默认操作磁带设备);

  • 压缩选项(可选):通过 -z/-j/-J 调用不同压缩工具,生成对应后缀的压缩包(如 .tar.gz)。

2. 核心选项分类

(1)必选操作参数(核心功能)

短参数

GNU 长参数

功能描述

-c

--create

创建新的归档文件(打包),常用于生成 .tar

或压缩包(如 .tar.gz

-x

--extract

/--get

从归档文件中解压文件(解包),无需指定压缩格式(tar 会自动识别)

-t

--list

列出归档文件中的所有内容(查看包内文件,不解压)

-r

--append

向已存在的归档文件末尾追加新文件(仅支持未压缩的 .tar 文件,压缩包不支持)

-d

--diff

/--compare

对比归档文件与本地文件系统的差异(如文件大小、修改时间是否一致)

-A

--catenate

/--concatenate

将多个归档文件合并为一个(仅支持未压缩的 .tar 文件)

--delete

--delete

从归档文件中删除指定文件(仅支持未压缩的 .tar 文件,压缩包不支持)

-u

--update

仅向归档文件追加 “比包内现有文件更新” 的文件(增量打包)

(2)压缩相关选项

通过以下选项调用压缩工具,实现 “打包 + 压缩” 一体化操作:


短参数

对应压缩工具

生成压缩包后缀

功能描述(打包时压缩 / 解压时解压缩)

-z

gzip

.tar.gz

/.tgz

压缩率中等,速度较快

-j

bzip2

.tar.bz2

压缩率高于 gzip,速度较慢

-J

xz

.tar.xz

压缩率最高,速度最慢

-a

自动识别

无固定后缀

根据归档文件后缀自动选择压缩工具(如 .tar.gz

用 gzip)

(3)常用辅助选项

短参数

GNU 长参数

功能描述

-v

--verbose

显示操作细节(如打包 / 解压的文件名),便于排查问题

-C

--directory=DIR

指定操作目录(如解压到 /tmp

,或打包时进入 /etc

目录)

-p

--preserve-permissions

保留文件的权限属性(如所有者、读写权限,默认不保留,备份系统文件时建议加)

-k

--keep-old-files

解压时不覆盖本地已存在的文件(默认会覆盖)

-O

--to-stdout

解压文件到标准输出(stdout),可结合管道传递给其他命令

-P

--absolute-names

保留文件的绝对路径(默认会去掉路径开头的 /

,避免覆盖系统文件)

-T

--files-from=FILE

从指定文件(如 list.txt

)中读取要打包的文件列表(批量打包)

-X

--exclude-from=FILE

从指定文件中读取要排除的文件列表(批量排除)

--exclude=PATTERN

直接指定要排除的文件 / 目录(如 --exclude=/app/log

3. 经典实操案例

(1)仅打包(不压缩)

  • 打包单个 / 多个文件:tar -cvf 归档名.tar 文件1 文件2
    例:
    tar -cvf test.tar f1.txt f2.txt(生成 test.tar,显示打包细节)

  • 打包目录(递归包含子目录):tar -cvf 归档名.tar 目录
    例:
    tar -cvf log.tar /var/log(打包 /var/log 目录,默认去掉路径开头的 /

  • 打包时保留绝对路径:tar -cPf etc.tar /etc(加 -P,保留 /etc 的绝对路径)

(2)打包并压缩

结合 -z/-j/-J 实现 “打包 + 压缩”,后缀名需对应:


压缩方式

命令示例

生成文件

特点

gzip

tar -zcvf etc.tar.gz /etc

etc.tar.gz

速度快,压缩率中等

bzip2

tar -jcvf etc.tar.bz2 /etc

etc.tar.bz2

压缩率高,速度慢

xz

tar -Jcvf etc.tar.xz /etc

etc.tar.xz

压缩率最高,速度最慢

(3)查看包内文件(不解压)

  • 查看未压缩包:tar -tvf test.tar

  • 查看压缩包(无需指定压缩格式,tar 自动识别):tar -tvf etc.tar.gz
    输出包含文件权限、所有者、大小、修改时间、文件名(如
    -rw-r--r-- root/root 4453 2024-05-01 f1.txt

(4)解包 / 解压

  • 解压到当前目录:tar -xf 归档名-x 解包,-f 指定文件,无需加 指定文件,无需加压缩参数)
    例:
    tar -xf etc.tar.gz(解压 etc.tar.gz 到当前目录)

  • 解压到指定目录:tar -xf 归档名 -C 目标目录
    例:
    tar -xf log.tar -C /tmp(将 log.tar 解压到 /tmp 目录)

  • 解压时不覆盖本地文件:tar -xkvf test.tar(加 -k,已存在的文件不覆盖)

(5)追加 / 删除文件(仅支持未压缩 .tar)

  • 追加文件到归档:tar -rvf test.tar f3.txt(向 test.tar 追加 f3.txt

  • 从归档删除文件:tar --delete -vf test.tar f1.txt(从 test.tar 中删除 f1.txt

(6)批量打包 / 排除文件

  • 从文件读取打包列表:先创建 list.txt(每行一个文件名),再执行 tar -zcvf x.tar.gz -T list.txt

  • 打包时排除指定文件:tar -zcvf app.tgz --exclude=/app/log --exclude=/app/tmp /app(排除 /app/log/app/tmp

  • 从文件读取排除列表:先创建 exclude.txt(每行一个排除路径),再执行 tar -zcvf app.tgz -T include.txt -X exclude.txt

二、split 工具:文件分割

split 用于将单个大文件(如大压缩包、日志文件)分割为多个小文件,便于存储(如 FAT32 分区最大支持 4GB 文件)或网络传输。分割后的文件可通过 cat 命令合并。

1. 核心语法

bash

split [选项]... [待分割文件] [输出文件前缀]


  • 待分割文件:指定要分割的大文件(如 large.tar.gz);

  • 输出文件前缀:分割后小文件的名称前缀(如 part,会生成 partaapartab... 或 part00part01...);

  • 若不指定前缀,默认生成 xaaxabxac... 格式的小文件。

2. 常用选项

短参数

长参数

功能描述

-b

--bytes=SIZE

大小分割(如 -b 100M

表示每个小文件 100MB,支持 K

/M

/G

单位)

-C

--line-bytes=SIZE

-b

类似,但会尽量保持每行的完整性(适合分割文本文件,如日志)

-l

--lines=NUMBER

行数分割(如 -l 1000

表示每个小文件包含 1000 行,仅适合文本文件)

-d

--numeric-suffixes

分割后小文件的后缀用数字表示(如 part00

part01

),默认用字母(partaa

--verbose

--verbose

显示分割过程(如 “creating file 'part00'”)

3. 经典实操案例

(1)按大小分割

  • 分割 1GB 的 data.tar.gz 为每个 200MB 的小文件,前缀为 data_part,数字后缀:
    split -b 200M -d data.tar.gz data_part
    生成文件:
    data_part00data_part01data_part02data_part03data_part04(共 5 个,最后一个可能小于 200MB)

(2)按行数分割文本文件

  • 分割 access.log(日志文件)为每个包含 5000 行的小文件,前缀为 log_part
    split -l 5000 access.log log_part
    生成文件:
    log_partaalog_partablog_partac...

(3)分割时保持行完整性

  • 分割大文本文件,每个小文件最大 100KB,且不拆分单行:
    split -C 100K --verbose access.log log_part

(4)合并分割后的文件

通过 cat 命令将分割后的文件合并为原文件(顺序不能错):
cat data_part00 data_part01 data_part02 data_part03 data_part04 > data.tar.gz

三、tar 与 split 结合使用

当需要备份超大型目录(如几十 GB 的数据)时,可先通过 tar 打包压缩,再用 split 分割为小文件,步骤如下:


  1. 打包压缩:tar -zcvf large_data.tar.gz /data(生成大压缩包);

  2. 分割为 10GB 小文件:split -b 10G -d large_data.tar.gz large_data_part

  3. 传输后合并:cat large_data_part00 large_data_part01 > large_data.tar.gz

  4. 解压:tar -xf large_data.tar.gz -C /restore

四、常见问题与注意事项

  1. 压缩包后缀与工具对应.tar.gz-z.tar.bz2-j.tar.xz-J,但解压时无需指定(tar 自动识别);

  2. 绝对路径风险:打包时默认去掉路径开头的 /,避免解压时覆盖系统文件;若需保留绝对路径,加 -P(谨慎使用);

  3. 压缩包不支持追加 / 删除--append/--delete 仅对未压缩的 .tar 文件有效,压缩包(如 .tar.gz)无法操作;

  4. split 合并顺序:分割后的文件需按后缀顺序合并(如 part00part01),否则文件损坏。