请选择 进入手机版 | 继续访问电脑版
查看: 293|回复: 2

[求助问答] 基于cpio命令使用详细示例解析(1)

[复制链接]

签到天数: 104 天

[LV.6]签到达人

发表于 2018-10-12 18:02:23 | 显示全部楼层 |阅读模式
(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目录是同级别的。

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

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部