真正高效打包大量小文件需四步:禁用-v输出、优先纯打包不压缩、用-t指定精准文件列表、跨场景用管道直传避免落地。

直接用 tar -cf 打包大量小文件本身已经比逐个复制快得多,关键在于避免拖慢速度的干扰项——比如控制台输出、不必要的压缩、路径遍历开销,以及单线程瓶颈。下面几条是真正起效的做法。
去掉 -v 参数,禁用实时输出
默认加 -v 会让 tar 对每个文件都打印一行,百万级小文件下光输出就卡死终端、占用大量 CPU 和 I/O。实测去掉后打包耗时可下降 30%~50%。
- 低效写法:
tar -cvf archive.tar dir/ - 高效写法:
tar -cf archive.tar dir/(不加 -v)
优先用纯打包(-c),慎用压缩(-z/-j/-J)
打包和压缩是两步:tar 先拼成一个流,再交给 gzip/bzip2/xz 处理。压缩过程 CPU 占用高、不可并行,对“大量小文件”反而拉低整体吞吐。
- 若只是迁移或临时归档,用
tar -cf archive.tar dir/最快 - 若必须压缩,选 gzip(
-z)而非 bzip2 或 xz,它速度快、兼容性好 - 跨主机传输时,可边打包边传(管道),跳过本地存盘环节,进一步提速
用 -T 指定文件列表,精准控制打包范围
当目标文件分散、带复杂筛选逻辑(如只打 *.log 和 *.conf,排除临时文件),用 find 生成列表再喂给 tar,比 shell glob 更稳定、更少报错。
- 生成列表:
find /var/log -name "*.log" -mtime -7 > logs.txt - 按列表打包:
tar -cf logs.tar -T logs.txt - 注意:
-T后面的路径是相对当前工作目录的,建议先cd到根目录再执行,或统一用绝对路径
跨磁盘或跨机器时,用管道直传,不落地
本机不同磁盘间复制,或 A 主机往 B 主机传,绕过中间文件能省下两轮磁盘写入,尤其对 SSD/NVMe 效果明显。
- 本机磁盘间(如 /home → /data):
tar -cf - /home/src | (cd /data && tar -xf -) - 跨主机(A 发,B 收):
B 上监听:nc -l 34183 | tar -C /target -xf -
A 上发送:tar -cf - /src/dir | nc B_IP 34183











