GNU CPIO - 归档文件及从包中提取文件
1.简介:
在linux中,cpio是一种数据备份与恢复工具,用于创建cpio档案文件,从档案文件中抽取文件,或者把文件从一个目录复制到另外一个目录。生成的档案文件可以是一个磁盘文件,也可以写入磁带等数据流介质。cpio不仅能够处理二进制与ASCII头数据格式的cpio档案文件,也能够读写各种tar格式的档案文件。为了保持兼容,如果不特别指定,cpio通常仍然创建二进制头数据格式的档案文件。
cpio类似tar命令,可以将文件复制打包到cpio或tar格式的归档包文件中,也可以从归档包文件中复制文件。 归档包文件可以是磁盘上的文件, 也可以是磁带等设备文件。
从档案文件中抽取文件时,cpio命令能够自动识别读取的是哪一种档案文件,而且也能读取在不同的系统中创建的具有不同字节顺序的档案文件。
cpio有三种操作模式:
操作模式 | 模式说明 |
copy-out模式 | 该模式用于打包备份文件。 |
copy-in模式 | 该模式用于从归档包文件中恢复文件。 |
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---