cpio是Linux系统中一款经典的归档处理工具,它通过标准输入输出来处理文件归档,和tar工具功能类似但使用逻辑有差异,核心分为三种操作模式,分别对应不同的文件处理需求。

cpio三种操作模式概述
cpio的三种操作模式分别是copy-out模式、copy-in模式和copy-pass模式,三种模式通过不同的参数触发,处理流程和功能完全不同,下面分别展开说明。
1. copy-out模式(归档模式)
copy-out模式的作用是将文件打包成cpio格式的归档文件,对应参数为-o(或者--create)。该模式会从标准输入读取要归档的文件路径列表,然后将归档数据输出到标准输出,通常需要配合重定向将输出保存到归档文件中。
使用copy-out模式的基本步骤如下:
- 先通过
find等命令生成要归档的文件列表,输出到标准输出 - 将列表通过管道传递给cpio的copy-out模式
- 将cpio的标准输出重定向到目标归档文件
示例:将/home/test目录下的所有文件打包成test.cpio归档文件
# 查找/home/test下所有文件,打包成test.cpio find /home/test -type f | cpio -o > test.cpio
如果需要保留文件的权限、所有者等信息,可以加上-v参数显示处理过程,加上--preserve-permissions保留权限属性:
find /home/test -type f | cpio -o --preserve-permissions -v > test.cpio
2. copy-in模式(解压模式)
copy-in模式的作用是从cpio归档文件中提取文件,对应参数为-i(或者--extract)。该模式从标准输入读取cpio归档数据,然后将文件提取到当前目录或者指定目录。
示例:提取上面生成的test.cpio中的所有文件到当前目录
# 从test.cpio中提取所有文件 cpio -i < test.cpio
如果需要提取到指定目录,可以加上-d参数自动创建目录,加上-v显示提取过程:
# 提取test.cpio到/tmp/extract目录,自动创建不存在的目录 mkdir -p /tmp/extract cpio -i -d -v < test.cpio -D /tmp/extract
如果只需要提取归档中的部分文件,可以在参数后指定文件名通配符:
# 只提取test.cpio中以.txt结尾的文件 cpio -i *.txt < test.cpio
3. copy-pass模式(复制模式)
copy-pass模式的作用是直接在不同目录之间复制文件,不需要生成中间的归档文件,对应参数为-p(或者--pass-through)。该模式从标准输入读取要复制的文件列表,然后将文件复制到指定的目标目录。
示例:将/home/test目录下的所有文件复制到/tmp/copy_test目录
# 复制/home/test下所有文件到/tmp/copy_test,自动创建目录 find /home/test -type f | cpio -p -d -v /tmp/copy_test
copy-pass模式相当于省略了打包和解包的过程,直接完成文件复制,适合在本地目录之间批量复制文件,并且可以保留文件的权限、修改时间等属性,加上-m参数可以保留修改时间,加上--preserve-permissions保留权限:
find /home/test -type f | cpio -p -d -v -m --preserve-permissions /tmp/copy_test
三种模式的核心差异对比
为了更清晰区分三种模式的使用场景,以下是核心差异对比表:
| 模式名称 | 触发参数 | 核心功能 | 典型使用场景 |
|---|---|---|---|
| copy-out模式 | -o | 将文件打包成cpio归档 | 需要生成归档文件备份、传输文件时使用 |
| copy-in模式 | -i | 从cpio归档提取文件 | 需要解压cpio格式的归档文件时使用 |
| copy-pass模式 | -p | 直接复制文件到目标目录 | 本地目录间批量复制文件,不需要中间归档时使用 |
使用注意事项
- cpio默认不会处理目录本身,只会处理目录下的文件,如果需要包含目录结构,需要配合
find命令输出完整的文件路径 - 三种模式都需要通过标准输入输出来传递数据,所以通常需要配合管道、重定向来使用
- 如果归档文件是压缩过的(比如cpio配合gzip生成的文件),需要先解压再使用cpio处理,或者配合解压命令通过管道传递数据,例如
gzip -dc test.cpio.gz | cpio -i
cpio的三种模式覆盖了归档、解压、直接复制三类核心需求,理解每种模式的参数和功能后,就可以灵活应对不同的文件处理场景,是Linux系统管理中非常实用的工具。