GNU CPIO - 归档文件及从包中提取文件

发布时间 2023-07-26 12:01:57作者: veryhd

GNU CPIO - 归档文件及从包中提取文件

1.简介:

在linux中,cpio是一种数据备份与恢复工具,用于创建cpio档案文件,从档案文件中抽取文件,或者把文件从一个目录复制到另外一个目录。生成的档案文件可以是一个磁盘文件,也可以写入磁带等数据流介质。cpio不仅能够处理二进制与ASCII头数据格式的cpio档案文件,也能够读写各种tar格式的档案文件。为了保持兼容,如果不特别指定,cpio通常仍然创建二进制头数据格式的档案文件。

cpio类似tar命令,可以将文件复制打包到cpio或tar格式的归档包文件中,也可以从归档包文件中复制文件。 归档包文件可以是磁盘上的文件, 也可以是磁带等设备文件。

从档案文件中抽取文件时,cpio命令能够自动识别读取的是哪一种档案文件,而且也能读取在不同的系统中创建的具有不同字节顺序的档案文件。

cpio有三种操作模式:

操作模式

模式说明

copy-out模式

该模式用于打包备份文件。
cpio把文件复制到归档包中。cpio要打包的文件名来自标准输入,它从标准输入获得文件名列表,一行一个。 一般通过管道来将标准输入重定向到另一个命令的输出。最常见的方法是使用find命令生成文件名列表,然后通过管道传送给cpio,这样cpio就可以知道要备份的数据来自哪里。需要在find后面加上-depth选项, 减少因为进入没有访问权限的目录而出错。cpio默认把归档包文件写到标准输出,所以需要用重定向符号>或者>>将归档包数据输出重定向到一个文件中。

copy-in模式

该模式用于从归档包文件中恢复文件。
cpio它从标准输入读入归档包,将归档包中的文件读出或者列出归档包里的内容或者列出归档文件中的文件列表。它将从标准输入中读取归档文件。任意cpio的非选项参数都将认为是shell的glob通配pattern,只有文件名匹配了指定模式时才会从中提取出来或list出来。在cpio中,通配符不能匹配到"."或"/",所以如有需要,必须显式指定"."或"/"。如果没有指定匹配模式,则解压或列出所有文件。cpio将从归档包中读出的数据写到标准输出。

copy-pass模式

cpio拷贝一个目录树(即目录中所有文件)到另一个目录下,并在目标目录下以同名的子目录存在。copy-pass模式是copy-in模式再copy-out模式的结合,它中途没有涉及到任何归档行为。这是cpio的一个特殊用法。它从标准输入中读取待拷贝内容,然后将它们复制到目标路径下。

2.模式及参数说明:

[1]主操作模式

-i, --extract 从包中提取文件(以 copy-in模式运行)

-o, --create 创建包(以 copy-out 模式运行)

-p, --pass-through 运行 copy-pass 模式

-t, --list 显示输入内容列表

[2]应用于所有模式的选项:

--block-size=块大小 设置 I/O 块大小为 BLOCK-SIZE * 512 字节

-B 设置 I/O 块大小为 5120 字节

-c 使用老的可移植的(ASCII)包格式

-C, --io-size=NUMBER 设置 I/O 块大小为指定的 NUMBER 字节

-D, --directory=目录 切换到指定目录

--force-local 包文件是本地的,尽管名字中含有冒号

-H, --format=格式 使用指定的包格式

--quiet 不要显示已拷贝的块数

-R, --owner=[用户][:.][组] 设置所有文件的所有权信息到指定的用户和/或组

-v, --verbose 详细列出已处理的文件

-V, --dot 每处理一个文件就显示一个“.”

-W, --warning=标志 控制警告信息显示。当前标志可以是“none”、“truncate”

或“all”。多个选项可以累积。

[3]应用于 copy-in 及 copy-out 模式的操作修饰符

-F, --file=[[用户@]主机:]文件名 用“文件名”来替代标准输入和输出。如果是非本地的文件,

则用可选的“用户”和“主机”来指定用户名和主机名。

-M, --message=字符串 当到达备份介质的尾部的时候显示指定字符串

--rsh-command=命令 用指定的命令替代 rsh

[4]命令修饰仅在 copy-in 模式中有效:

-b, --swap 交换数据中每个字的两个半字以及每个半字中的两个字节。等价于-sS

-f, --nonmatching 仅拷贝不匹配任意给定的模式的文件

-I [[用户@]主机:]文件名 从文件读入而不是从标准输入读入。

如果文件在远程机器上,

则可指定用户和主机

-n, --numeric-uid-gid 在内容列表的详表中,显示数字的 UID和 GID

-r, --rename 交互式重命名文件

-s, --swap-bytes 交换文件中每个半字中的两个字节

-S, --swap-halfwords 交换文件中每个字(即4个字节)中的两个半字

--to-stdout 提取文件到标准输出

-E, --pattern-file=文件 从指定文件中读取额外的用于指定提取或列表的文件名的模式

--only-verify-crc 当读取一个 CRC格式的包,仅检验包中每个文件的CRC,不提取文件

[5]应用于 copy-out 模式的选项

-A, --append 追加到已存在的归档文件。

--device-independent, --reproducible 创建设备无关的(可重现的)归档

--ignore-devno 不存储设备号

-O [[用户@]主机:]文件名 使用包文件名而不是标准输出。如果文件在远程机器上,

则可指定用户和主机

--renumber-inodes 为inode重新编号

[6]应用于 copy-pass 模式的选项:

-l, --link 在可行时链接文件而不是拷贝文件

[7]应用于 copy-in 及 copy-out 模式的选项:

--absolute-filenames 文件名不去除文件系统前缀

--no-absolute-filenames 相对于当前目录来创建所有文件

[8]应用于 copy-out 及 copy-pass 模式的选项:

-0, --null 列表中的文件名使用 NULL

而不是换行符作为分割符

-a, --reset-access-time 文件读取后恢复文件的访问时间

-L, --dereference 跟随符号链接(拷贝符号链接指向的文件而不是拷贝链接本身)

[9]应用于 copy-in 和 copy-pass 模式的选项:

-d, --make-directories 需要时创建目录

-m, --preserve-modification-time 创建文件时保留以前文件的修改时间

--no-preserve-owner 不改变文件的所有权

--sparse 把含有大块零的文件以稀疏文件方式写出

-u, --unconditional 无条件覆盖所有文件

-?, --help 显示帮助信息

--usage 显示简短使用信息

--version 显示版本信息

注:用于长选项的必选(或可选)选项,对于短选项也是必选(或可选)的。

3.用法:

cpio [-ioptBcvVbfnrsSAl0aLdmu?] [-C NUMBER] [-D 目录] [-H 格式]

[-R [用户][:.][组]] [-W 标志]

[-F [[用户@]主机:]文件名] [-M 字符串]

[-I [[用户@]主机:]文件名] [-E 文件]

[-O [[用户@]主机:]文件名] [--extract] [--create]

[--pass-through] [--list] [--block-size=块大小]

[--io-size=NUMBER] [--directory=目录] [--force-local]

[--format=格式] [--quiet] [--owner=[用户][:.][组]] [--verbose]

[--dot] [--warning=标志] [--file=[[用户@]主机:]文件名]

[--message=字符串] [--rsh-command=命令] [--swap]

[--nonmatching] [--numeric-uid-gid] [--rename] [--swap-bytes]

[--swap-halfwords] [--to-stdout] [--pattern-file=文件]

[--only-verify-crc] [--append] [--device-independent]

[--reproducible] [--ignore-devno] [--renumber-inodes] [--link]

[--absolute-filenames] [--no-absolute-filenames] [--null]

[--reset-access-time] [--dereference] [--make-directories]

[--preserve-modification-time] [--no-preserve-owner] [--sparse]

[--unconditional] [--help] [--usage] [--version] [目标目录]

4.示例:

# 归档 name-list 中的文件到 archive

$cpio -o < name-list [> archive]

# 从 archive 中提取文件

$cpio -i [< archive]

# 拷贝 name-list 中的文件到目标目录(destination-directory)

$cpio -p destination-directory < name-list

实例:

将 etc 目录备份

$find ./etc -print |cpio -ov >etc.cpio

恢复文件

$cpio -idv

查看 etc.cpio 文件

$cpio -tv

文件系统 rootfs, 制作镜像方法如下

$cd rootfs

$find . | cpio -c -o -v |gzip -9 -n >../ramdisk.img

父目录下会生成一个 ramdisk.img 压缩文件系统镜像。

将镜像解压恢复成文件系统的命令

$mkdir rootfs

$cp ramdisk.img rootfs

$cd rootfs

$mv ramdisk.img ramdisk.img.gz

$gunzip ramdisk.img.gz

$cpio -i <ramdisk.img

$rm ramdisk.img

当前目录下就是原来 rootfs 中的内容

[1].解压文件

解压cpio文件:cpio -idmv < filename.cpio

解压img文件: cpio -idmv < filename.img

注意:cpio不能解压到指定目录,只能解压到当前目录,防止解压后混乱,方法如下:

mkdir tmp;

cp filename.cpio tmp;

cpio -idmv --no-absolute-filenames < filename.cpio;

这样,就能解压到tmp目录了

[2].备份还原

备份:cpio -covB > [file|device] 将数据备份到文件或设备上

还原:cpio -icduv < [file|device} 将数据还原到系统中

常用参数:

-o   :将数据copy到文件或设备上

-i   :将数据从文件或设备上还原到系统中

-t   :查看cpio建立的文件或设备内容

-c   :一种比较新的portable format方式存储

-v   :在屏幕上显示备份过程中的文件名

-B   :让预设的blocks可以增加到5120bytes,默认是512bytes,这样可以使备份速度加快

-d   :自动建立目录,这样还原时才不会出现找不到路径的问题

-u   :更新,用较新的文件覆盖旧的文件

-m   :创建文件时保留以前文件的修改时间

--no-absolute-filenames:

.cpio.gz

有xxx.cpio.gz文件

gunzip xxx.cpio.gz        //生成xxx.cpio文件

cpio -idmv < xxx.cpio       //生成xxx文件夹

-----fusmile.com---

参照: GNU cpio home page

General help using GNU software

linux cpio三种操作模式

Linux命令学习手册-cpio