Linux系统之cpio命令详解

cpio 是一个用于创建和管理归档文件的工具,支持多种格式的归档文件,包括 .cpio 格式。它可以在不同的目录之间复制文件,并且能够通过管道与其他命令配合使用来创建或提取归档。cpio 工具特别适用于需要处理大量文件或者需要通过网络传输文件的情况。

1. 命令概述

名称cpio
作用

  • 用于创建、提取或复制文件归档(archive)。
  • 支持从标准输入读取文件列表,或将文件写入到标准输出。
  • 可以处理多种归档格式,包括 cpiotar 格式。

核心功能

  • 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
注意事项
  1. 路径处理

    • 默认保留绝对路径(使用--no-absolute-filenames禁用)
    • 建议配合find -depth处理目录权限
  2. 大文件支持

    # 调整块大小提升性能
    find /bigdata | cpio -o -C 10240 > big.cpio
    
  3. 校验机制

    # 验证CRC校验(仅crc格式)
    cpio --only-verify-crc -it < archive.cpio
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值