cpio命令详解

cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件。

选项 含义

1
2
3
4
5
6
7
-o 将文件拷贝打包成文件或者将文件输出到设备上。
-i 将打包文件解压或者将设备上的备份还原到系统。
-t 查看cpio打包的文件内容或者输出到设备上的文件内容。
-v 显示打包过程中的文件名称。
-d 在cpio还原文件的过程中,自动的建立相应的目录。
-c 一种较新的存储方式。
-B 让默认的Blocks可以增大到5120 bytes,默认Blocks512 bytes,这样做的好处是可以加快存取速度。

注意:

1)cpio恢复的路径,如果cpio在打包备份的时候用的是绝对路径,那么在恢复的时候会自动恢复到这些绝对路径下,同理,如果在打包备份用的是相对路径,还原时也将恢复到相对路径下。

2)cpio无法直接读取文件,它需要每个文件或者目录的完整路径名才能识别读取,而find命令的输出刚好做到了这点,因此,cpio命令一般和find命令配合使用。

3)cpio恢复的时候不会自动覆盖同名文件。

4)不会创建目录而是直接解压到当前文件夹。

[举例]

*将etc目录备份:

1
find ./etc -print |cpio -ov >etc.cpio

*要恢复文件的时候

1
#cpio -idv </root/etc.cpio

*只是查看etc.cpio文件,可以使用

1
# cpio -tv <etc.cpio

输入之后,输出如下:

1
2
3
4
5
6
7
8
9
10
drwxrwxr-x   4 quiethea quiethea        0 Nov  4 17:14 etc
-rw-rw-r-- 1 quiethea quiethea 0 Nov 4 17:07 etc/2
drwxrwxr-x 2 quiethea quiethea 0 Nov 4 17:07 etc/11
-rw-rw-r-- 1 quiethea quiethea 0 Nov 4 17:07 etc/11/11
-rw-rw-r-- 1 quiethea quiethea 0 Nov 4 17:07 etc/4
drwxrwxr-x 2 quiethea quiethea 0 Nov 4 17:07 etc/22
-rw-rw-r-- 1 quiethea quiethea 0 Nov 4 17:07 etc/3
-rw-rw-r-- 1 quiethea quiethea 0 Nov 4 17:07 etc/1
-rw-rw-r-- 1 quiethea quiethea 0 Nov 4 17:07 etc/5
这样显示得是将要恢复得文件得名称。

[其它]

现在,内核刚刚启动的时候,会事先挂一个initrd内存文件系统,这个initrd文件系统镜像可以由cpio制作。参见内核源码文档initrd.txt.

*例如我有一个非常简单的文件系统rootfs.制作镜像方法如下:

1
2
$cd rootfs
$find . | cpio -c -o -v |gzip -9 -n >../ramdisk.img

这样,父目录下会生成一个ramdisk.img压缩文件系统镜像。

*将镜像解压恢复成文件系统的命令:

1
2
3
4
5
6
7
$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中的内容了。

cpio常与find 配合使用

实例2

1.文件或目录打包。 

打包有如下多种情况:
 
A)含子目录打包:

1
find /usr/local/hbchen/ -print|cpio -o > /tmp/hbchen1.cpio

将/usr/local/hbchen目录下的文件与子目录打包成一个文件库为/tmp/hbchen1.cpio。 
若通过-o选项来打包整个目录下的所有文件与子目录,常先利用find目录名-print来找出所有文件与子目录的名称,通过管道“ ”传给cpio打包。 

B)不含子目录的打包:

1
ls /usr/local/hbchen |cpio -o > /tmp/hbchen3.cpio

将/usr/local/hbchen目录下的文件(不含子目录下的文件)打包成一个文件库为/tmp/hbchen3.cpio。 

C)特定文件打包:

可利用文本搜索命令grep与管道配合,可以排除或选择特定类型的文件传给cpio打包。

1
2
3
如: ls /usr/local/hbchen/*.txt |cpio -o >/tmp/hbchen0.cpio
或 ls /usr/local/hbchen |grep '\*.txt$' |cpio -o >/tmp/hbchen6.cpio
find /usr/local/hbchen目录下以.txt结尾的文件予以打包。

又如:ls /usr/local/hbchen grep 1 cpio -o >/tmp/hbchen9.cpio,其意为找出/usr/local/hbchen目录下文件名中含有1字符的文件予以打包。 

ls /usr/local/hbchen |grep -v 1 |cpio -o > /tmp/hbchen11.cpio,其意为找出/usr/local/hbchen目录下文件名中不含 1 字符的文件予以打包。-v选项在grep命令中的意思是排除含有字符串的行列。 

如此,可充分利用Unix的管道和一些命令的强大功能来实现文件的打包。