您的位置:首页 > 其它

cpio

2016-07-03 15:23 218 查看
cpio:copy file to and from archives 复制文件到归档文件中,从归档文件中复制文件
描述:来自man文档
GNU cpio是一个这样的工具:创建和提取归档文件,将文件从一个地方拷贝到另一个地方。它可以处理一些cpio格式的文件,也可以读写tar格式文件。
cpio支持的归档文件格式有:binary, old ASCII, new ASCII, crc, HPUX binary, HPUX old ASCII, old tar, and POSIX.1 tar。tar格式是为了兼容tar程序(Linux中的归档程序)。cpio默认会创建binary格式的归档文件,这是为了兼容老版本的cpio程序。当从归档文件中提取文件时,cpio会自动识别生在读取的是哪一种归档格式的文件,还可以读取在与本机字节顺序不同的机器上创建的归档文件。
模式
cpio 有三种模式:
1.copy-out 模式
在copy-out模式中,cpio拷贝文件进而创建归档。它从标准输入中读取以一个名字占一行的格式列出的文件名列表,而后将创建的归档内容打印到标准输出上。一个典型的生成文件名列表的方式是用find命令,在find命令中你可以用-depth选项来最小化在不可达目录上的权限问题。
使用方法:
1)能列出文件列表到标准输出的cmd(ls,find) | cpio -o [options] [> file]
2)cpio -o [options] < namelist.file [>file]
无论是|还是namelist,cpio -o 都要接受来自标准输入的输入
[options]
-o/--create 进入copy-out模式
-0 将来自标准输入的文件名列表的分隔符设置为null,替换默认的换行符。这样就可以归档那些文件名包含换行符的文件名了。
这个选项可以用在copy-out和copy-pass模式中
-A 将此次生成的归档追加到一个已经存在的归档中
-c 等价于-H newc 使用new SVR4 可移植格式 可以用在copy-out和copy-in中使用
-H FORMAT 使用归档的格式 可以用在copy-out和copy-in中使用
支持的常见格式:
bin 淘汰的二进制格式
odc 老的(POSIX.1版本)可移植格式
newc new SVR4 可移植格式,支持拥有多于65536个inode的文件系统
tar 老的tar格式
ustar POSIX.1版本的tar格式。也识别GNU tar归档文件,它们很类似,但不相同
-v 列出被处理的文件 三种模式均可用
e.g.: ls|cpio -ov > file
Attention:cpio -o 是接受来自标准输入,并将其视为文件列表,因此在这个列表中没有的文件,自然就不会被归档,例如,子目录下的文件。稳妥的办法是使用find的命令来生成文件列表,这样比较齐全,隐藏文件,整个目录结构上的文件列表都会被列出来。这样再使用cpio 进行归档,就很方便,不会遗漏了。
e.g.
find ~/ print | cpio -ov > file
find . | cpio -o -H newc | gzip -9 > /boot/initrd-2.6.22.1.img 制作内核文件

2.copy-in 模式
在copy-in模式中,cpio从归档中拷贝出文件,或者列出归档的内容。它从标准输入中读取归档。任何非cpio选项的命令行参数都是shell的通配模式。只有匹配那个模式的文件名,cpio才会从归档中将文件拷出。与在shell中不同,在文件名起始处的.不能匹配模式开始处的通配符,文件名中的/可以匹配通配符。如果不指定模式,那么所有文件都会被提取。
使用方法:
1)cpio -i [options] [pattern] < archive.file
2)能输出archive内容到标准输出的cmd(例如rpm2cpio) | cpio -i [options] [pattern]
无论哪种方法,cpio从标准输入接受的必须是归档文件才会有正确的输出
-i 进入copy-in模式
-d 在需要的地方创建与输入文件相同的目录结构,还原时自动生成目录,copy-in和copy-pass可用
-c 参见copy-out
-H FOMAT 参见copy-out
-v 参见copy-out
-t 打印输入内容的表格,就是预览,只有copy-in有效
pattern 非cpio选项内容的通配符,可以达到只解档或显示某个或某些文件的效果
e.g.cpio -it <1.cpio 预览
cpio -iv <1.cpio 完全解档,某些情况下加不加-d都可以创建完整的目录结构,但一般都加会比较好
假若只解档其中的某个文件
cpio -iv */f1 < 1.cpio 如果f1在一个目录下,而这个目录不存在,就会解档失败,因此这是需要-d
cpio -idv */f1 <1.cpio
上述例子说明了pattern的用法,建议匹配某个目录下的f1用*/f1,而非*f1,后者貌似不能正常工作,还可以支持复杂的pattern
e.g.cpio -idv */dir3/*[1-4] < ../1.cpio

此外我们还可以查看一个rpm包中包含的内容,甚至可选地解档出某个文件
rpm2cpio tree-1.6.0-10.el7.x86_64.rpm | cpio -idv 解档整个rpm包
rpm2cpio tree-1.6.0-10.el7.x86_64.rpm | cpio -idv */tree.1* 解档某个文件

3.copy-pass 模式
在copy-pass模式中,cpio将文件从一个目录树拷贝到另一个目录树下,这个模式结合copy-out和copy-in的步骤却实际上没有使用归档。它读取来自标准输入的文件列表,将其拷贝到指定目录当中,这个目录是以非cpio选项的参数的形式来指定
使用方法:是copy-out和copy-in的综合,没有中间生成arhive步骤了
1)能列出文件列表到标准输出的cmd(ls,find) | cpio -o [options] dest_dir
2)cpio -o [options] dest_dir <namelist
无论是|还是namelist,cpio -p 都要接受来自标准输入的输入,这跟copy -o一致,也充分说明了copy -o 是它处理步骤的一部分
-p 进入copy-pass模式
-0 参见copy-out
-v 参见copy-out
-d 在需要的地方创建与输入文件相同的目录结构 参见copy-in
e.g.find test | cpio -pdv ~/d1
这里不使用ls的原因在于,cpio -p将来自标准输入的输入视为文件名,这样来进行复制的,ls只会打印目录下的一级目录,因此,使用ls作为cpio -p的输入时,复制会不完整,而且也缺失了隐藏文件。使用find 比较稳妥
find test print > namelist2
cpio -pdv ~/d2 < namelist2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: