- 移动开发
- 开发工具
【免费下载链接】ZeroTermux
本文基于 ZeroTermux 内置命令手册 cpio.md 展开,系统讲解 cpio 在 Linux/Android Termux 环境中的备份、还原与复制能力:包括 copy-out / copy-in / copy-pass 三种工作模式、全部核心选项的语义与取值、与 find 命令配合的典型用法,以及绝对路径与相对路径的还原行为差异。读完本文,你将能够独立使用 cpio 完成"按需打包 → 列表查验 → 选择性还原"的完整备份链路,并理解 ZeroTermux 内置命令查询(CommandDialog)是如何将这份 Markdown 手册渲染成可交互帮助文档的。
cpio 是什么:三种操作模式
cpio(copy in and out)是一类经典的 Unix 归档工具,主要用来建立或者还原备份档:它可以把文件复制到归档包中,也可以从归档包中把文件复制出来。与 tar 不同,cpio 本身没有遍历文件系统的能力,它依赖标准输入传入的文件完整路径名来识别要处理的文件——这正是 cpio 必须与find配合使用的根本原因(这一点在原文档末尾有明确总结,下文实战部分会再次验证)。
cpio 有且仅有三种操作模式,分别由三个互斥选项触发:
| 模式 | 选项 | 作用 |
|---|---|---|
| copy-out(输出模式) | -o/--create | 读取标准输入中的路径列表,建立备份档(输出到标准输出或-O指定文件) |
| copy-in(输入模式) | -i/--extract | 从备份档中还原文件(从标准输入或-I指定文件读取) |
| copy-pass(直通模式) | -p/--pass-through | 不经过归档文件,直接将文件复制到目的目录 |
三种模式对应了"打包备份、还原备份、直接拷贝"三大场景。原文档中的四个实例正是围绕前两种模式展开的。
语法
cpio(选项)cpio 不接受普通的文件参数,所有待处理的路径都通过管道从标准输入读取。因此实际使用时通常写成:
find 路径 -type f | cpio -ocvB > 备份档选项全解
以下完整收录原文档列出的全部选项,并补充取值说明与注意事项。
常用核心选项
| 选项 | 说明 |
|---|---|
-o/--create | 执行 copy-out 模式,建立备份档 |
-i/--extract | 执行 copy-in 模式,还原备份档 |
-p/--pass-through | 执行 copy-pass 模式,跳过归档直接复制文件到目的目录 |
-t/--list | 只将输入的内容(备份档中的文件清单)呈现出来,不实际解包 |
-v/--verbose | 详细显示指令的执行过程 |
-V/--dot | 处理每个文件时在行首加一个.号,用于进度提示 |
归档文件与格式
| 选项 | 说明 |
|---|---|
-F<备份档>/--file=<备份档> | 指定备份档名称,取代标准输入/输出;也能借此通过网络使用另一台主机的保存设备存取备份档 |
-O<备份档> | 指定备份档名称,取代标准输出(copy-out 模式专用) |
-I<备份档> | 指定备份档名称,取代标准输入(copy-in 模式专用)。(注:原文档此处写作-l<备份档>,但 GNU cpio 中该选项实为-I,请与下方-l/--link硬链接选项区分) |
-H<备份格式> | 指定备份时使用的文件格式。GNU cpio 常见格式有bin(旧二进制)、odc(POSIX 可移植)、newc/crc(新型可移植,支持大文件)、tar/ustar等 |
-c | 使用旧 ASCII 备份格式(等价于-H odc) |
-B | 将输入/输出的区块大小改为 5120 Bytes(即 10 个 512 字节块) |
-C<区块大小>/--io-size=<区块大小> | 设置输入/输出的区块大小,单位是 Byte |
--block-size=<区块大小> | 设置输入/输出的区块大小,取值为 512 字节的倍数:例如设置 5,则区块大小为 2500(原文数值);设置 10,则区块大小为 5120,以此类推 |
--sparse | 若一个文件内含有大量连续 0 字节,则将其存储为稀疏文件,可显著节省归档空间 |
--force-local | 强制将备份档存放在本地主机(不当作远程设备处理) |
--only-verify-crc | 当备份档采用 CRC 备份格式(-H crc)时,可用此参数检查备份档内每个文件是否正确无误 |
文件处理与路径行为
| 选项 | 说明 |
|---|---|
-a/--rest-access-time | 重新设置文件的存取时间(备份后恢复 atime) |
-d/--make-directories | 如有需要 cpio 会自行建立目录(还原时常用) |
-m/--preserve-modification-time | 不去更改文件的修改时间(保留原 mtime) |
-u/--unconditional | 置换所有文件,不论日期时间新旧,均不询问而直接覆盖 |
-r/--rename | 当有文件名称需要更改时,采用互动模式逐文件询问 |
-R<拥有者><:/.><所属群组>/--owner | 在 copy-in 还原或 copy-pass 复制时,指定复制文件的拥有者与所属群组 |
--no-absolute-filenames | 使用相对路径建立文件名称 |
--no-preserve-owner | 不保留文件的拥有者,谁解开备份档,文件就归谁所有 |
-L/--dereference | 不建立符号链接,直接复制该链接所指向的原始文件 |
-l/--link | 以硬链接的方式取代复制文件,可在 copy-pass 模式下运用 |
-s/--swap-bytes | 交换每对字节的内容(处理跨平台字节序差异时使用) |
-S/--swap-halfwords | 交换每半个字(2 字节)的内容 |
-b/--swap | 此参数效果与同时指定-s相同(原文档写作--awap,应为--swap的笔误) |
-n/--numeric-uid-gid | 配合-tv参数列出备份档内容时,以用户识别码和群组识别码替代拥有者与群组名称 |
过滤与兼容性
| 选项 | 说明 |
|---|---|
-0/--null | 接受新增列控制字符,通常配合 find 指令的-print0参数使用,可正确处理文件名中的空格与换行 |
-E<范本文件>/--pattern-file=<范本文件> | 指定范本文件,内含一个或多个范本样式,让 cpio 只解开符合范本条件的文件;格式为每列一个范本样式 |
-f/--nonmatching | 让 cpio 解开所有不符合范本条件的文件(与-E互补) |
-A/--append | 附加到已存在的备份文档中;该备份文档必须存放在磁盘上,而不能放置于磁带机里 |
-M<回传信息>/--message=<回传信息> | 设置更换保存媒体的提示信息(多卷归档时使用) |
-k | 此参数将被忽略不予处理,仅用于解决 cpio 不同版本间的兼容性问题 |
--quiet | 不显示复制了多少区块 |
--help | 在线帮助 |
--version | 显示版本信息 |
为什么 cpio 必须与 find 配合
原文档明确指出:cpio 无法直接读取文件,它需要每个文件或者目录的完整路径名才能识别读取,而find命令的输出恰好提供了这一路径清单。因此 cpio 的典型用法永远是管道组合:
find <起始路径> <条件> | cpio <选项> ...这里有三个值得注意的细节:
- 路径语义决定还原位置:cpio 打包时记录的是 find 输出的路径。若 find 给出的路径以
/开头(绝对路径),还原时会自动恢复到这些绝对路径下;若给出的是相对路径,还原时也会恢复到相对路径下(详见下一节实例)。 - 特殊字符安全:文件名含空格或换行时,应改用
find -print0配合cpio -0,避免路径被错误拆分成多行。 - 职责分工清晰:
find负责"筛选哪些文件",cpio 负责"把这些文件装进归档/取出归档",两者通过管道解耦,可以灵活组合出"只备份普通文件""排除某类文件""按修改时间备份"等各种策略。
实战实例:备份、查验与还原
实例 1:备份/etc下所有普通文件
find /etc -type f | cpio -ocvB > /opt/etc.cpiofind /etc -type f列出/etc下所有普通文件(不含目录与特殊文件);-o进入 copy-out 模式,-c使用 ASCII 格式,-v详细显示,-B使用 5120 字节区块;- 输出重定向到
/opt/etc.cpio生成备份档。
实例 2:将系统所有资料备份到磁带机
find / -print | cpio -covB > /dev/st0/dev/st0是磁带设备名,代表 SCSI 磁带机。这里使用find / -print遍历整个根文件系统,属于全量备份的经典写法;-c、-o、-v、-B的含义同上。
实例 3:查看磁带机上的备份内容
cpio -icdvt < /dev/st0 > /tmp/st_content-i进入 copy-in 模式,-t表示仅列出内容而不实际解包,-c匹配 ASCII 格式,-d允许在列表时建立目录结构,-v详细输出;- 当备份文件过多、一屏无法显示完毕时,将输出重定向到
/tmp/st_content文件,再分页查看。
实例 4:还原实例 1 的备份包并覆盖同名文件
cpio -icduv < /opt/etc.cpio-u(无条件覆盖)保证即使目的位置已有同名文件,也不询问直接覆盖;-d自动重建缺失的目录层级;-v显示还原过程。
实例 5:copy-pass 直通复制(原文档模式的补充实战)
find . -depth -print | cpio -pdm /opt/mirror-p进入 copy-pass 模式,跳过归档文件直接复制到目的目录,-d自动建目录,-m保留修改时间。该模式适合在同机不同目录间做"免中间归档"的同步复制。
绝对路径与相对路径的还原行为
原文档特别强调了一个极易踩坑的行为:cpio 打包时记录什么路径,还原时就恢复到什么路径。
- 若打包时 find 给出的是绝对路径(如
find /etc -type f),还原时文件会自动恢复到这些绝对路径下。实例 4 中cpio -icduv < /opt/etc.cpio会把备份文件全部还原到/etc路径下对应的目录中——因此执行还原通常需要 root 权限或对目标目录的写权限。 - 若打包时用的是相对路径(如在目录内执行
find . -type f),还原时也将恢复到相对路径下,即相对当前工作目录解包。
这一特性在 ZeroTermux 的 Android 环境中同样适用:对/data/data/com.termux下的用户目录做备份时,务必先规划好路径语义,避免还原时把文件散落到意外位置。若需要"解到指定目录",可在 copy-in 模式中使用-R指定拥有者,或先cd到目标目录再以相对路径解包(结合--no-absolute-filenames可强制相对路径行为)。
在 ZeroTermux 中查阅这份手册
这份 cpio.md 并不是孤立的文本,它是 ZeroTermux 内置"命令手册"体系的一员,存放在 app/src/main/assets/cmd 目录下(同目录还收录了rpm2cpio.md、dd.md、tar相关手册等数百个命令文档,dd.md中甚至明确建议"文件系统备份优先使用 tar、cpio 等命令")。
从源码可以还原出它的完整调用链:
- 入口:在 TermuxActivity 的浮窗(BoomWindow.java)中点击"命令"按钮,创建并弹出
CommandDialog。 - 加载列表:CommandDialog.java 的
initData()通过AssetManager.list("cmd")枚举 assets 中全部.md手册,并支持在 搜索过滤逻辑 中按关键字实时筛选命令名。 - 渲染展示:showCmdDetail() 打开
cmd/cpio.md文件流,使用 flexmark 的Parser解析 Markdown,再由HtmlRenderer渲染为 HTML,最终通过 WebView 展示(WebView 已开启单列排版与缩放支持,见 initViewDialog)。
也就是说,你在 ZeroTermux 终端浮窗中看到的这份 cpio 手册,本质上就是本文所依据的同一份 Markdown 文档的在线渲染版。理解这一机制后,你也可以自行查看 cmd 目录 下其他命令手册,获得同样的"语法—选项—实例"完整参考。
总结与选型建议
cpio 与 tar 同为经典归档工具,但侧重点不同:cpio 与 find 管道配合灵活,对特殊文件(设备文件、符号链接、硬链接)的处理能力更强,且天然支持按任意条件筛选文件;tar 则胜在自带文件遍历能力和更广泛的生态兼容。在 ZeroTermux 的日常使用中,cpio 适合做"精确到文件集合"的定向备份与迁移,例如备份指定目录、打包后校验(CRC 格式配合--only-verify-crc)、以及通过磁带/远程设备做多卷归档。掌握本文的三种模式、选项语义与路径还原规则,即可安全、高效地把它纳入自己的备份工具箱。
- 移动开发
- 开发工具
【免费下载链接】ZeroTermux
相关推荐
linux-command 命令手册:cpio 归档备份与还原完整实战指南
linux command 命令手册:cpio 归档备份与还原完整实战指南 cpio 是 Linux 系统中用于 建立与还原归档备份 的核心工具程序,本指南完整
文档教程ZeroTermux 内置命令手册精讲:cdrecord 光盘刻录命令的完整用法与实战
ZeroTermux 内置命令手册精讲:cdrecord 光盘刻录命令的完整用法与实战 导读 本文聚焦 ZeroTermux 内置 Linux 命令手册中的 c
移动开发开发工具ZeroTermux 内置命令手册精讲:cmp 命令逐字节比较两个文件差异的完整实战指南
ZeroTermux 内置命令手册精讲:cmp 命令逐字节比较两个文件差异的完整实战指南 导读 cmp 是 Linux 系统中用于逐字节比较两个文件是否有差异的
移动开发开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考