Linux 命令:cpio

cpio 是 Linux/Unix 系统中一款老牌的文件打包/解包工具,与 tar 功能类似,但更偏向底层文件操作。它通过标准输入/输出来读取/写入文件,支持多种归档格式,常用于系统备份、恢复(如 initramfs 构建)等场景。

资料合集:https://pan.quark.cn/s/6fe3007c3e95https://pan.quark.cn/s/561de99256a5https://pan.quark.cn/s/985f55b13d94https://pan.quark.cn/s/d0fb20abd19a

核心功能

  • 打包:从标准输入读取文件列表,将文件打包为 cpio 归档文件。
  • 解包:从标准输入读取 cpio 归档文件,解压到指定目录。
  • 列表:查看 cpio 归档文件内的文件列表。
  • 支持多种归档格式:bin(默认)、odcnewccrc 等,其中 newc 是最常用的现代格式。

基本语法

cpio 依赖模式参数指定操作类型,语法格式如下:

# 打包:-o (--create)
ls | cpio -o > archive.cpio

# 解包:-i (--extract)
cpio -i < archive.cpio

# 列表:-t (--list)
cpio -t < archive.cpio

核心模式参数

模式 作用
-o / --create 打包模式,读取标准输入的文件列表,生成归档文件
-i / --extract 解包模式,读取标准输入的归档文件,解压到当前目录
-t / --list 列表模式,查看归档文件内的文件清单

常用选项

选项 作用
-v 显示详细过程(打包/解包的文件名),便于调试
-d 解包时自动创建缺失的目录(必备选项,避免目录丢失)
-u 强制覆盖已存在的文件(默认不覆盖)
-c 使用 newc 格式(现代兼容格式,推荐)
-f 过滤文件,仅解压/打包匹配指定模式的文件
-m 保留文件的原始修改时间(默认解压后更新时间)
-F <文件名> 指定归档文件路径(替代重定向 </>

典型用法

一、 打包操作

1. 基础打包(指定文件)

通过 lsfind 输出文件列表,管道传给 cpio -o 打包:

# 打包当前目录下所有 .txt 文件
find . -name "*.txt" | cpio -ocv > text_files.cpio
# -o:打包  -c:newc 格式  -v:显示详情
2. 打包整个目录

find 递归获取目录下所有文件,避免遗漏子目录:

# 打包 /home/user/docs 目录下所有内容
find /home/user/docs | cpio -ocv > docs_archive.cpio
3. 用 -F 指定归档文件名(替代重定向)
find . -type f | cpio -ocv -F files.cpio

二、 解包操作

1. 基础解包(保留目录结构)

必须加 -d 选项,否则子目录不会自动创建:

# 解压到当前目录
cpio -idv < text_files.cpio
# -i:解包  -d:创建目录  -v:显示详情
2. 解压到指定目录

先切换到目标目录,再执行解包命令:

# 解压到 /tmp/extract 目录
mkdir -p /tmp/extract
cd /tmp/extract
cpio -idv < /path/to/text_files.cpio
3. 强制覆盖解压

-u 选项覆盖已存在的同名文件:

cpio -iduv < text_files.cpio
4. 过滤解压(仅解压指定文件)

-f 匹配文件名,仅解压符合条件的文件:

# 仅解压归档中的 config.txt 文件
cpio -idv -f "config.txt" < archive.cpio

三、 查看归档文件列表

1. 简单列表
cpio -t < text_files.cpio
# 输出归档内所有文件路径
2. 详细列表(显示文件大小/权限)
cpio -tv < text_files.cpio
# 输出示例:
# -rw-r--r-- 1 root root  1024 2025-12-30 10:00 ./test1.txt
# -rw-r--r-- 1 root root  2048 2025-12-30 10:01 ./subdir/test2.txt

四、 系统级场景:构建 initramfs

cpio 最核心的用途是构建 initramfs(Linux 启动时的临时根文件系统),步骤如下:

# 1. 准备 initramfs 内容(如内核模块、init 脚本)
mkdir -p initramfs/{bin,lib,init}
# 2. 打包为 initramfs.cpio.gz
cd initramfs
find . | cpio -ocv | gzip -9 > ../initramfs.cpio.gz

注意事项

  1. 依赖管道输入cpio 不会主动扫描文件,必须通过 find/ls 等命令管道传递文件列表,否则会等待标准输入。
  2. 解包必加 -d:如果归档包含子目录,不加 -d 会导致文件解压到当前目录,丢失目录结构。
  3. tar 的区别
    特性 cpio tar
    输入方式 依赖管道传递文件列表 直接指定文件/目录
    常见用途 系统启动(initramfs)、底层备份 日常文件打包/压缩
    压缩支持 需配合 gzip/bzip2 内置 -z/-j 压缩选项
  4. 格式兼容性:默认 bin 格式兼容性差,建议始终加 -c 选项使用 newc 格式。

补充:cpio 与 tar 常用命令对比

需求 cpio 命令 tar 命令
打包目录 `find dir cpio -ocv > dir.cpio`
解包 cpio -idv < dir.cpio tar -xvf dir.tar
查看列表 cpio -t < dir.cpio tar -tvf dir.tar
压缩打包 `find dir cpio -ocv
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐