Linux tar 怎样用 --files-from 批量读取待打包路径
来源:17golang原创
时间:2026-11-08 04:09:18 294浏览 收藏
Linux tar 处理长文件清单时,不必把几百个路径全部展开在命令行上。使用 --files-from(短写法 -T)即可让 tar 从文件或标准输入读取待归档名称;如果文件名可能包含空格、换行或以短横线开头,再配合 --null 与 --verbatim-files-from,边界会更清楚。
官方地址:https://www.gnu.org/software/tar/manual/html_section/files.html
最小可用写法是 tar --create --gzip --file=archive.tar.gz --files-from=files.txt。列表中的每个名称都会成为归档输入;目录是否继续展开、名称怎样分隔,则由后续选项决定。
用 --files-from 读取长文件清单
--files-from=FILE 或 -T FILE 把路径来源从命令行移到文件。列表文件通常每行一个名称,也可以把 - 作为 FILE,让 tar 从标准输入读取。这个方式适合由上游脚本生成清单,也能避免命令行长度成为限制。
# files.txt 每行放一个相对路径,便于控制归档内的名称
tar --create --gzip --file=archive.tar.gz --files-from=files.txt
# 用标准输入接收上游命令产生的列表
find ./project -type f -name '*.conf' -print \
| tar --create --gzip --file=project-conf.tar.gz --files-from=-
列表里的目录默认仍可能带出目录下的内容;如果只想收录列出的目录条目,可以增加 --no-recursion。因此,-T 解决的是“名称从哪里来”,不是“目录是否递归”的开关。

用相对路径控制归档里的成员名称
文件列表中的名称会直接影响归档成员名。实际维护时,通常在项目根目录生成相对路径,再把这份清单交给 tar;这样解包时更容易保持预期的目录层级,也不必把本机绝对路径暴露给归档。
# 先进入项目根目录,让清单记录相对名称
cd /srv/app
# 清单中的路径相对当前目录写入归档
tar --create --file=/tmp/app.tar --files-from=/srv/app/files.txt
# 只读取清单里的目录项,不继续向下遍历
tar --create --file=/tmp/app-norecurse.tar \
--no-recursion --files-from=/srv/app/files.txt
这里要区分两个问题:工作目录决定名称如何组织,--no-recursion 决定目录条目是否继续展开。不要把它们混成“排除目录”的用法;需要排除模式时,应使用单独的排除选项。
用 --null 处理特殊文件名
换行分隔的列表适合普通文件名,但文件名本身可能包含空格或换行。更稳妥的组合是上游用 find -print0 产生 NUL 分隔名称,tar 侧用 --null 读取;--verbatim-files-from 则明确告诉 GNU tar 按原样处理列表中的名称,避免把名称中的特殊形式当作额外语法。
# -print0 与 --null 使用同一种 NUL 分隔,避免换行文件名被拆开
find ./project -type f -print0 \
| tar --create --gzip --file=project.tar.gz \
--null --verbatim-files-from --files-from=-
要点只有三个:生成端和读取端的分隔协议要一致;--null 要作用于后面的文件列表;列表中的名称不要再额外拼接 shell 引号。若使用普通文本文件,先确认它确实是一行一个路径,再决定是否需要 NUL 格式。

归档前后的速查与常见误区
| 需求 | 关键写法 | 注意点 |
|---|---|---|
| 从文本文件读路径 | --files-from=files.txt | 通常一行一个名称 |
| 从管道读路径 | --files-from=- | 标准输入不能同时承担别的用途 |
| 处理换行文件名 | --null --verbatim-files-from | 上游应使用 -print0 |
| 不展开目录 | --no-recursion | 只影响目录递归,不改变列表来源 |
归档完成后,可以用 tar --list --file=archive.tar.gz 查看成员清单。这个动作只读取归档目录,不会把它当成“重新打包”;它适合确认列表中的名称是否进入了预期的归档边界。
相关问题
列表里有以短横线开头的文件名怎么办?
不要依赖 shell 的引号来改变 tar 对文件列表的解析方式。使用 GNU tar 支持的 --verbatim-files-from,并结合明确的列表格式处理名称。
--files-from 能不能读取目录?
可以读取目录条目;是否继续收录目录内容由递归设置决定。需要只收录清单中的目录名时,使用 --no-recursion。
-
462 收藏
-
252 收藏
-
422 收藏
-
383 收藏
-
127 收藏
-
367 收藏
-
226 收藏
-
369 收藏
-
356 收藏
-
225 收藏
-
104 收藏
-
232 收藏
-
439 收藏
-
479 收藏
-
316 收藏
-
333 收藏
-
451 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习