登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

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 解决的是“名称从哪里来”,不是“目录是否递归”的开关。

files.txt、标准输入、--files-from、路径条目、目录递归和 archive.tar.gz 的静态结构关系说明图
图1:文件列表到归档成员的结构说明图,展示 --files-from 读取路径后的数据边界。

用相对路径控制归档里的成员名称

文件列表中的名称会直接影响归档成员名。实际维护时,通常在项目根目录生成相对路径,再把这份清单交给 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 格式。

换行列表、NUL 分隔、find -print0、--null、--verbatim-files-from 与特殊文件名的静态依赖关系说明图
图2:文件名边界说明图,对比换行列表与 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。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>