1.1 cpio基本介绍

cpio是一个非常古老的归档工具。已逐渐被tar替代,但是有些功能是tar不存在的,所以还是分享下它的用法。

cpio - copy files to and from archives

cpio用于创建、解压归档文件,也可以对归档文件执行拷入拷出的动作,即向归档文件中追加文件,或从归档文件中提取文件。它也支持tar格式的归档文件,但是对压缩后的tar(如.tar.gz格式)就没法支持了,cpio毕竟不会调用对应的(解)压缩工具。

cpio一般从标准输入获取数据,写入到标准输出,所以一般会结合管道、输入重定向、输出重定向使用。

cpio有三种运行模式:

Copy-out模式:此模式下,cpio将向归档文件中拷入文件,即进行归档操作,所以成为归档模式。它会从标准输入中读取待归档的文件,将它们归档到目标目标中,若未指定归档的目标,将归档到标准输出中。在copy-out模式下,最典型的是使用find来指定待归档文件,在使用find时,最好加上"-depth"以尽可能减少可能出现的问题,例如目录的权限问题

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

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

1.2 cpio命令用法说明

对于cpio这个归档工具来说,它和其它命令有一个区别:在cpio命令行中给出的非选项参数都会认为是pattern。非选项参数的意思是这个参数不是为选项指定的参数。如cpio -t abc <a.cpio中,"-t"选项的功能是列出文件列表,它不需要参数,但后面给定了abc,则表示列出匹配abc的文件或目录。

选项说明:

-o:(--create)指定运行为copy-out模式,即归档模式

-i:(--extract)指定运行为copy-in模式,即提取模式

-p:(--pass-through)指定运行为copy-pass模式,即目录拷贝模式

-t:(--list)列出归档文件中的文件列表

-B:设置I/O的block大小为5120字节,默认为512字节

-C IO-SIZE:(--io-size=IO-SIZE)指定I/O的block大小为IO-SIZE大小

-I archive:使用指定的归档文件名替代标准输入(从标准输入读取的,所以肯定是解压模式,即copy-in)

-O archive:使用指定的归档文件名替代标准输出(输出到标准输出的,所以肯定是归档模式,即copy-out)

-F archive:(--file=archive)使用指定的归档文件名替代标准输入或输出。所以无论是copy-in还是copy-out模式都可以使用-F指定归档文件

:注意copy-out即归档模式下,其默认行为等价于重定向符号">",所以内容会完全覆盖,但归档文件(inode)不变

-A:(--append)向已存在的归档文件中追加文件,只能使用-F或-O指定归档文件,只能用在copy-out模式下。不等价于重定向符号">>",">>"后在归档文件中找不到追加的文件

--to-stdout:解压文件到标准输出,用在copy-in模式

-E FILE:(--pattern-file=FILE)从FILE中读取pattern进行匹配,匹配到的将解压或列出它们,用在copy-in模式。

-f:(--nonmatching)仅copy不匹配指定pattern的文件

-u:(--unconditional)当目标中有同名文件时,强制替换冲突文件

-a:(--reset-access-time)重置文件的atime,即保留文件的原始atime

-m:(--preserve-modification-time)保留文件的原始mtime

-d:(-make-directories)当需要的时候自动创建目录

-0:(--null)解析空字符串\0

--quiet:不输出拷贝时的block数量信息

-v:给出详细信息

1.3 示例

(1).将家目录下的所有文件都归档到tree.cpio中。

[root@server2 ~]# find ~ -depth | cpio -ov > tree.cpio 或 [root@server2 ~]# find ~ -depth | cpio -ov -F tree.cpio

但要非常注意一点,如果使用find搜索,且归档文件和搜索目录是同一路径时,它会将归档文件本身也归档到归档文件中,即进行了迭代归档。

例如上面的例子中,将find家目录的所有文件都归档到tree.cpio,但tree.cpio也将是放在家目录下的,它也会被find搜素到,所以也会被归档到其自身中去。可能这里会有所疑惑了,不是应该find处理完之后才处理cpio吗?非也,管道的作用只是进程间数据传递的作用,但不是一定要等管道左边的处理完成之后才传递,而是左边边处理边传递到右边的,如果左边处理的太快,导致管道拥堵,那么管道左边的程序将等待管道有空闲空间。

要解决迭代归档的问题,只要让归档文件不被find搜索到即可。可以在find中排除、在cpio中排除或归档文件放到其他目录下去。

[root@server2 ~]# find ~ -depth | cpio -ov -F /tmp/tree.cpio

一般出于准确性考虑,会在find上使用"-print0",然后在cpio上使用"--null"解析空字符。

[root@server2 ~]# find ~ -depth -print0 | cpio --null -ov -F /tmp/tree.cpio

(2).列出归档文件中的文件列表。

[root@server2 tmp]# cpio -t -F tree.cpio 或 [root@server2 tmp]# cpio -t < tree.cpio

这将会递归列出tree.cpio中的所有文件,所以这不会是你想要的,应该对其指定一个匹配模式。

[root@server2 tmp]# cpio -t -F tree.cpio /root/*

[root@server2 tmp]# cpio -t /root/* < tree.cpio

这将列出tree.cpio中所有/root/目录下的内容,但是很显然,"*"号没法匹配点开头的隐藏文件,所以不会显示出隐藏文件。

[root@server2 tmp]# cpio -t -F tree.cpio /root/.*

但这样又只会列出隐藏文件。如何既列出隐藏文件,也列出普通文件?在cpio中好像不直接支持这样的通配,以下是我想到的一个办法。

[root@server2 tmp]# cpio -t -F tree.cpio /root/{.*,*}

注意,cpio命令行中任意非选项参数都会被当成pattern。

(3).向归档文件中追加文件。

注意,不要使用重定向符号">>"进行追加,虽然从归档文件最后的打下上看是追加成功了,但是实际上你却不知道它追加到哪里去了,根本就找不到追加的内容。所以,还是用"-A"选项。

[root@server2 tmp]# ls /root/new.txt | cpio -oA -F tree.cpio

这将会把/root/new.txt下的文件追加到tree.cpio中,由于tree.cpio中已经有了/root目录,所以追加后路径为tree.cpio中的/root/new.txt。

而如果tree.cpio中没有待追加文件所在的目录,则会新建一个目录。

[root@server2 tmp]# find /boot -depth -print0 | cpio -oA -F tree.cpio

这将会在tree.cpio中追加一个/boot目录,它和/root目录是同级别的。

好像没有办法直接指定追加的目标路径。

(4).提取文件。

注意:cpio只能提取文件时只能提取到当前目录下。

[root@server2 tmp]# cpio -idv -F tree.cpio /root/

new.txt
cpio: new.txt not created: newer or same age version exists

这就会提取/root/下的new.txt到当前目录,显然,这里报了一个错,提示当前目录下已经存在较待提取文件更新的同名文件,所以并没有进行提取。如果要强行提取,使用功能"-u"选项,这将覆盖已存在动作。

[root@server2 tmp]# cpio -idvu -F tree.cpio new.txt

其实,只要是同名文件,不管它的时间戳是否比待提取更新,都不会提取,除非强制提取。

这里"-d"选项的作用是提取时如果前导目录不存在,则自动创建。反正不会影响已存在目录,所以"-i"一般都会加上个"-d"。

(5).目录文件复制,即copy-pass模式。

注意,该模式下复制的目录在目标位置上是以子目录形式存在的。例如,例如复制/root目录到/tmp/abc下,则在/tmp/abc下会有root子目录,在/tmp/abc/root下才是源/root中的文件。

[root@server2 tmp]# find ~ -depth -print0 | cpio --null -pvd /tmp/abc [root@server2 tmp]# ll /tmp/abc dr-xr-x--- root root Jun : root

cpio用法详细说明的更多相关文章

  1. DataSet用法详细 转

    DataSet用法详细 转 DataSet用法详细 一.特点介绍 1.处理脱机数据,在多层应用程序中很有用. 2.可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法. 3.处理分级 ...

  2. Android webservice的用法详细讲解

    Android webservice的用法详细讲解 看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧.此文章采用的项目是我毕业设计的webserv ...

  3. DataSet用法详细

    转自:http://www.cnblogs.com/zeroone/archive/2012/06/08/2541299.html DataSet用法详细 一.特点介绍 1.处理脱机数据,在多层应用程 ...

  4. jquery.cookie用法详细解析,封装的操作cookie的库有jquery.cookie.js

    jquery.cookie用法详细解析 需要注意存入cookie前,对数据进行序列化, 得到后在反序列化: 熟练运用:JSON.stringify();和JSON.parse(): 通常分为如下几个步 ...

  5. Linux截屏工具scrot用法详细介绍

    Scrot是Linux命令行中使用的截图工具,能够进行全屏.选取等操作,下面小编将针对Scrot截图工具的用法给大家做个详细介绍,通过操作实例来学习Scrot的使用.   在Linux中安装Scrot ...

  6. aspx与ascx,ashx的用法详细的总结介绍

    这篇文章主要是对aspx与ascx,ashx的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 做asp.net开发的对.aspx,.ascx和.ashx都不会陌生.关于它们,网 ...

  7. php class类的用法详细总结

    以下是对php中class类的用法进行了详细的总结介绍,需要的朋友可以过来参考下 一:结构和调用(实例化): class className{} ,调用:$obj = new className(); ...

  8. jquery.cookie用法详细解析

    本篇文章主要是对jquery.cookie的用法进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将 ...

  9. MySql之ALTER命令用法详细解读(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细解读了MySql语法中Alter命令的用法,这是一个用法比较多的语法,而且功能还是很强 ...

随机推荐

  1. TOMCAT的框架结构

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样 ...

  2. 分布式锁与实现(二)——基于ZooKeeper实现

    引言 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...

  3. thinkphp 框架中的一部分方法解析

     1 thinkphp 框架 中判断输入的数值和数据库中的数值是否一致    首先 需要在view文件夹下建一个模板 名为zhuce.html <html> <head> &l ...

  4. 【CSS】思考和再学习——关于CSS中浮动和定位对元素宽度/外边距/其他元素所占空间的影响

      一.width:auto和width:100%的区别   1.width:100%的作用是占满它的参考元素的宽度.(一般情况下参考元素 == 父级元素,这里写成参考元素而不是父级元素,在下面我会再 ...

  5. DTCMS插件的制作实例电子资源管理(三)前台模板页编写

    总目录 插件目录结构(一) Admin后台页面编写(二) 前台模板页编写(三) URL重写(四) 本实例旨在以一个实际的项目中的例子来介绍如何在dtcms中制作插件,本系列文章非入门教程,部分逻辑实现 ...

  6. Day3 Pyhon的六大数据类型

    Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Sets(集合) Dictionary(字典) Number(数字) Py ...

  7. js中addEventListener第三个参数涉及到的事件捕获与冒泡

    js中,我们可以给一个dom对象添加监听事件,函数就是 addEventListener("click",function(){},true); 很容易理解,第一个参数是事件类型, ...

  8. 蚂蚁金服新一代数据可视化引擎 G2

    新公司已经呆了一个多月,目前着手一个数据可视化的项目,数据可视化肯定要用到图形库如D3.Highcharts.ECharts.Chart等,经决定我的这个项目用阿里旗下蚂蚁金服所开发的G2图表库. 官 ...

  9. struts-config.xml的配置

    1.<struts-config>  元素 <struts-cofnig> 元素是 Struts 配置文件的根元素.<struts-config> 元素有 8 个子 ...

  10. 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)

    A------------------------------------------------------------------------------------ 题目链接:http://20 ...