cpio
是一个用于创建和管理归档文件的工具,支持多种格式的归档文件,包括 .cpio
格式。它可以在不同的目录之间复制文件,并且能够通过管道与其他命令配合使用来创建或提取归档。cpio
工具特别适用于需要处理大量文件或者需要通过网络传输文件的情况。
1. 命令概述
名称:cpio
作用:
- 用于创建、提取或复制文件归档(archive)。
- 支持从标准输入读取文件列表,或将文件写入到标准输出。
- 可以处理多种归档格式,包括
cpio
和tar
格式。
核心功能:
- Copy-out 模式:将文件打包为归档文件。
- Copy-in 模式:从归档文件中解压文件或列出内容。
- Copy-pass 模式:直接在目录树之间复制文件,无需中间归档文件。
2. 基本语法
1. 创建归档(copy-out)
find 源目录 -print | cpio -ov > 归档文件.cpio
2. 提取归档(copy-in)
cpio -iv < 归档文件.cpio
3. 目录拷贝(copy-pass)
find 源目录 -print | cpio -pvd 目标目录
3. 选项
3.1 常用选项
选项 | 作用 | 示例 |
---|---|---|
-0, --null | 读取以空字符分隔的文件名列表(适用于文件名包含换行符的情况)。 | `find . -print0 |
-a, --reset-access-time | 读取文件后重置访问时间,避免显示文件被访问过的痕迹。 | cpio -o -a < filelist > archive.cpio |
-A, --append | 在现有归档文件中追加文件(仅适用于 copy-out 模式)。 | cpio -o -A -F archive.cpio < newfilelist |
-B | 设置 I/O 块大小为 5120 字节(默认 512 字节)。 | cpio -o -B > archive.cpio |
-C size, --io-size=size | 设置 I/O 块大小为指定字节数。 | cpio -o -C 10240 > archive.cpio |
-d, --make-directories | 创建必要的父目录结构。 | cpio -i -d < archive.cpio |
-f, --nonmatching | 仅复制与给定模式不匹配的文件。 | cpio -i -f "*.log" < archive.cpio |
-H format | 指定归档格式(如 bin , odc , newc , crc , tar , ustar 等)。 | cpio -o -H newc > archive.cpio |
-m, --preserve-modification-time | 保留文件的修改时间。 | cpio -i -m < archive.cpio |
-t, --list | 列出归档文件的内容,而不提取文件。 | cpio -t < archive.cpio |
-v, --verbose | 显示详细信息(如正在处理的文件名)。 | cpio -o -v > archive.cpio |
-u, --unconditional | 无条件覆盖已存在的文件。 | cpio -i -u < archive.cpio |
3.2 核心选项
通用参数
选项 | 描述 |
---|---|
-v | 显示处理过程 |
-V | 用点号显示进度 |
--quiet | 禁止显示块计数 |
创建模式(-o)
选项 | 功能 |
---|---|
-A | 追加到已有归档 |
-H format | 指定格式(bin/newc/tar等) |
-O file | 输出到指定文件 |
提取模式(-i)
选项 | 功能 |
---|---|
-d | 自动创建目录 |
-m | 保留文件修改时间 |
-t | 仅列出归档内容 |
-u | 无条件覆盖文件 |
拷贝模式(-p)
选项 | 功能 |
---|---|
-l | 硬链接替代拷贝 |
-L | 追踪符号链接 |
4. 归档格式支持
cpio
支持以下归档格式:
bin
:旧版二进制格式(已废弃)。odc
:旧版便携式 ASCII 格式。newc
:新版 SVR4 便携式格式(推荐使用)。crc
:带校验和的新版 SVR4 格式。tar
:旧版 tar 格式(兼容性)。ustar
:POSIX tar 格式。
默认格式:
- Copy-out 模式默认为
bin
。 - Copy-in 模式会自动检测归档格式。
5. 示例
1. 创建归档
# 创建newc格式归档(适合现代系统)
find /data -print0 | cpio --null -ov -H newc > data.cpio
# 备份时保留所有者(需root)
find /home -print | sudo cpio -o -H crc > home_backup.cpio
2. 提取归档
# 列出归档内容
cpio -t < etc_conf.cpio
# 交互式提取(遇到冲突提示)
cpio -idv < archive.cpio
# 仅提取特定文件
cpio -ivd "*.conf" < configs.cpio
3. 高级应用
# 跨主机备份(使用SSH)
find /opt | cpio -o -H tar | ssh user@backup "cat > backup.tar"
# 远程归档
find /data -print | cpio -o -H newc -F user@remote:/path/to/archive.cpio
# 处理含特殊字符的文件名
find . -print0 | cpio --null -pvd /mnt/backup
# 复制文件到另一目录,将 /source 目录下的所有文件复制到 /destination
find /source -print | cpio -p /destination
4. 解压 .rpm
文件
cpio
命令本身并不直接支持解压 .rpm
文件,因为 RPM 包是一种特殊的归档格式,它不仅包含了文件的压缩归档,还包括了元数据和签名信息。要解压 RPM 文件,通常需要使用 rpm2cpio
工具将 RPM 文件转换为 CPIO 归档,然后可以使用 cpio
来提取其中的文件。
1.使用 rpm2cpio 转换
首先,需要使用 rpm2cpio
命令将 RPM 文件转换成一个 CPIO 归档文件。这个过程不会实际创建一个独立的文件,而是将输出发送到标准输出(stdout)。
rpm2cpio package.rpm > package.cpio
2.直接管道传输给 cpio
,无需生成中间的 .cpio
文件:
rpm2cpio package.rpm | cpio -idmv
这里 -i
表示输入模式(用于提取),-d
表示如果必要则创建目录,-m
保留原始文件的修改时间,-v
显示处理过程中的文件名。
6. 常见问题
Q1:如何处理文件名中包含换行符的情况?
A:
find . -print0 | cpio -o --null > archive.cpio
Q2:如何提取特定类型的文件?
A:
cpio -i "*.txt" < archive.cpio
Q3:如何将文件复制到远程主机?
A:
find /data -print | cpio -o -F user@remote:/path/to/archive.cpio
Q4:如何查看归档文件的格式?
A:
file archive.cpio
注意事项
-
路径处理:
- 默认保留绝对路径(使用
--no-absolute-filenames
禁用) - 建议配合
find -depth
处理目录权限
- 默认保留绝对路径(使用
-
大文件支持:
# 调整块大小提升性能 find /bigdata | cpio -o -C 10240 > big.cpio
-
校验机制:
# 验证CRC校验(仅crc格式) cpio --only-verify-crc -it < archive.cpio