简述
cpio
(Copy in/out file archives) 是类似 tar
一样的用于处理归档文件的工具,虽然其诞生时间比 tar 稍晚一些,但是其凭借更加广泛的通用性在使用者中也是颇为流行。与 tar
工具不同,cpio
没有专门用于压缩归档的选项,换言之,cpio
对归档进行压缩是分为两步:先用 cpio
创建归档,然后用其他的压缩工具对归档文件进行压缩。
在正式使用 cpio
命令之前,我们需要先了解它的三种操作模式,每一种模式对应着一种不同的功能:
- copy-out 模式 – 创建归档(或备份)。您可以通过
-o
或--create
选项启用此模式。在此模式中,您必须使用特定命令(find
、ls
或cat
)生成一个文件列表并将其传递给cpio
。需要注意文件列表应该足够简单,因此ls
命令不能使用任何选项以及参数对象。 - copy-in 模式 – 从归档中提取文件。您可以通过
-i
或--extract
选项启用此模式。 - copy-pass 模式 – 将文件从一个目录复制到另一个目录。 您可以通过
-p
或--pass-through
选项启用此模式。
tar
命令一样,使用 cpio
命令时需要注意文件列表的保存方式(绝对路径 或 相对路径)。与
tar
命令一样,为了安全性考虑,我们不建议您使用绝对路径创建 cpio 归档。次要功能:
-t
– 打印输入的内容表。仅工作在 copy-in 模式。-A
– 将一个或多个文件追加到现有归档中。仅工作在 copy-out 模式。-v
– 显示详细的处理细节。工作在任意模式。
cpio
中的相关符号:
- > :用在 copy-out 模式 中,相当于指定归档文件
- < :用在 copy-in 模式 中,相当于指定归档文件
-F
选项表示指定归档文件,可以替换 cpio 命令中的 标准输入(“<") 和标准输出 (">“)。对于归档文件的格式,有:
- bin (默认)
- odc
- newc
- crc
- tar
- ustar
- hpbin
- hpodc
您可以用 -H format
指定需要的归档文件格式,该选项可以工作在 copy-in 模式或 copy-out 模式。
文件后缀名的约定
- 若您的 cpio 归档使用绝对路径的列表文件,则其后缀应该为
.A.cpio
- 若您的 cpio 归档使用相对路径的列表文件,则其后缀应该为
.cpio
语法规范
copy-out 模式 的语法:
<command> | cpio {-o|--create} [options] [> archive]
copy-in 模式 的语法:
cpio {-i|--extract} [options] [pattern...] [< archive]
copy-pass 模式 的语法:
cpio {-p|--pass-through} [options] destination-directory < name-list
* “{ }” 表示是必需的;
* “|” 表示或的意思;
* “[ ]” 表示是可选的;
* “…” 表示同样的对象可以有多个;
* “< >” 表示是可以变化的;
* 粗体表示必须按照原始样式输入;
* 斜体或下划线则表示需要使用适当的值进行替换;
* “[ | | ]” 表示两个或多个的选项,用户需要选择其中的任意一个。
copy-out 模式的示例
-
使用 find 命令将绝对路径的文件列表传递给 cpio
Shell > find /etc/ | cpio -ov > /tmp/etc.A.cpio
-
使用 ls 命令将相对路径的文件列表传递给 cpio
Shell > cd /var/log/ ; ls | cpio -ov > /tmp/log.cpio
-
使用 cat 命令将绝对路径的文件列表传递给 cpio
Shell > echo -e "/etc/shadow\n/etc/chrony.conf" >> /root/file-list Shell > cat /root/file-list /etc/shadow /etc/chrony.conf Shell > cat /root/file-list | cpio -ov > /tmp/custom.A.cpio
find
命令可以将相对路径或绝对路径的文件列表传递给 cpio
;使用
ls
命令仅可以将相对路径的文件列表传递给 cpio
;使用
cat
命令可以将绝对路径或相对路径的文件列表传递给 cpio
。-
将一个或多个文件追加到现有归档中
Shell > find /etc/yum.* | cpio -o -A -F /tmp/custom.A.cpio
-F
或 -O
选项。copy-in 模式的示例
选项:
-E
– 指定 pattern 以提取指定需要的文件。pattern 即单个文件内容中的文件列表。-u
– 无条件地替换所有文件。该选项可以工作在 copy-in 模式或 copy-pass 模式。
-
查看归档文件的内容
Shell > cpio -tv < /tmp/custom.A.cpio ---------- 1 root root 726 Dec 7 19:48 /etc/shadow -rw-r--r-- 1 root root 1177 Dec 1 16:12 /etc/chrony.conf lrwxrwxrwx 1 root root 12 Oct 17 2023 /etc/yum.conf -> dnf/dnf.conf drwxr-xr-x 2 root root 0 Jun 8 2024 /etc/yum.repos.d -rw-r--r-- 1 root root 1332 Aug 31 04:48 /etc/yum.repos.d/epel.repo -rw-r--r-- 1 root root 731 Jun 7 2024 /etc/yum.repos.d/Rocky-HighAvailability.repo -rw-r--r-- 1 root root 2335 Jun 7 2024 /etc/yum.repos.d/Rocky-Sources.repo -rw-r--r-- 1 root root 680 Jun 7 2024 /etc/yum.repos.d/Rocky-NFV.repo -rw-r--r-- 1 root root 1773 Jun 7 2024 /etc/yum.repos.d/Rocky-Debuginfo.repo -rw-r--r-- 1 root root 680 Jun 7 2024 /etc/yum.repos.d/Rocky-Media.repo -rw-r--r-- 1 root root 1680 Aug 31 04:48 /etc/yum.repos.d/epel-modular.repo -rw-r--r-- 1 root root 695 Jun 7 2024 /etc/yum.repos.d/Rocky-Extras.repo -rw-r--r-- 1 root root 1779 Aug 31 04:48 /etc/yum.repos.d/epel-testing-modular.repo -rw-r--r-- 1 root root 1919 Sep 13 12:38 /etc/yum.repos.d/docker-ce.repo -rw-r--r-- 1 root root 1431 Aug 31 04:48 /etc/yum.repos.d/epel-testing.repo -rw-r--r-- 1 root root 715 Jun 8 2024 /etc/yum.repos.d/Rocky-PowerTools.repo -rw-r--r-- 1 root root 710 Jun 7 2024 /etc/yum.repos.d/Rocky-AppStream.repo -rw-r--r-- 1 root root 746 Jun 7 2024 /etc/yum.repos.d/Rocky-ResilientStorage.repo -rw-r--r-- 1 root root 695 Jun 7 2024 /etc/yum.repos.d/Rocky-BaseOS.repo -rw-r--r-- 1 root root 690 Jun 7 2024 /etc/yum.repos.d/Rocky-Plus.repo -rw-r--r-- 1 root root 360 Jul 11 2024 /etc/yum.repos.d/Rocky-Devel.repo -rw-r--r-- 1 root root 681 Jun 7 2024 /etc/yum.repos.d/Rocky-RT.repo
-
从归档文件中提取部分文件
Shell > mkdir -p /tmp/restore-log-dir/ Shell > cpio -tv < /tmp/log.cpio Shell > echo -e "btmp\ncron\ndnf.log" >> /root/log-file-list Shell > cat /root/log-file-list btmp cron dnf.log Shell > cd /tmp/restore-log-dir/ ; cpio -iv -E /root/log-file-list < /tmp/log.cpio
若您需要提取归档中的全部文件,移除
-E
选项即可。
copy-pass 模式的示例
在此模式下,仅支持相对路径的文件列表,其最终呈现效果等同于 cp -p
。来看如下的例子:
Shell > mkdir /tmp/test-dir
Shell > cd /etc/yum.repos.d/ ; find ./ | cpio -p /tmp/test-dir
Shell > ls -l /tmp/test-dir/
total 72
-rw-r--r-- 1 root root 1919 Jan 27 12:05 docker-ce.repo
-rw-r--r-- 1 root root 1680 Jan 27 12:05 epel-modular.repo
-rw-r--r-- 1 root root 1332 Jan 27 12:05 epel.repo
-rw-r--r-- 1 root root 1779 Jan 27 12:05 epel-testing-modular.repo
-rw-r--r-- 1 root root 1431 Jan 27 12:05 epel-testing.repo
-rw-r--r-- 1 root root 710 Jan 27 12:05 Rocky-AppStream.repo
-rw-r--r-- 1 root root 695 Jan 27 12:05 Rocky-BaseOS.repo
-rw-r--r-- 1 root root 1773 Jan 27 12:05 Rocky-Debuginfo.repo
-rw-r--r-- 1 root root 360 Jan 27 12:05 Rocky-Devel.repo
-rw-r--r-- 1 root root 695 Jan 27 12:05 Rocky-Extras.repo
-rw-r--r-- 1 root root 731 Jan 27 12:05 Rocky-HighAvailability.repo
-rw-r--r-- 1 root root 680 Jan 27 12:05 Rocky-Media.repo
-rw-r--r-- 1 root root 680 Jan 27 12:05 Rocky-NFV.repo
-rw-r--r-- 1 root root 690 Jan 27 12:05 Rocky-Plus.repo
-rw-r--r-- 1 root root 715 Jan 27 12:05 Rocky-PowerTools.repo
-rw-r--r-- 1 root root 746 Jan 27 12:05 Rocky-ResilientStorage.repo
-rw-r--r-- 1 root root 681 Jan 27 12:05 Rocky-RT.repo
-rw-r--r-- 1 root root 2335 Jan 27 12:05 Rocky-Sources.repo
压缩 cpio 归档
前面提到,要压缩 cpio 归档,您需要使用其他的压缩工具(bzip2、gzip、xz、zip 等)
Shell > gzip /tmp/custom.A.cpio
Shell > ls -l /tmp/custom*
-rw-r--r-- 1 root root 3263 Jan 27 11:15 /tmp/custom.A.cpio.gz
