码迷,mamicode.com
首页 > 其他好文 > 详细

cpio

时间:2016-07-03 23:45:47      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:cpio

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


cpio

标签:cpio

原文地址:http://bloodhero.blog.51cto.com/4496010/1795313

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!