GNU/Linux — cpio命令

简述

cpio(Copy in/out file archives) 是类似 tar 一样的用于处理归档文件的工具,虽然其诞生时间比 tar 稍晚一些,但是其凭借更加广泛的通用性在使用者中也是颇为流行。与 tar 工具不同,cpio 没有专门用于压缩归档的选项,换言之,cpio 对归档进行压缩是分为两步:先用 cpio 创建归档,然后用其他的压缩工具对归档文件进行压缩。

在正式使用 cpio 命令之前,我们需要先了解它的三种操作模式,每一种模式对应着一种不同的功能:

  1. copy-out 模式 – 创建归档(或备份)。您可以通过 -o--create 选项启用此模式。在此模式中,您必须使用特定命令(findlscat)生成一个文件列表并将其传递给 cpio。需要注意文件列表应该足够简单,因此 ls 命令不能使用任何选项以及参数对象。
  2. copy-in 模式 – 从归档中提取文件。您可以通过 -i--extract 选项启用此模式。
  3. copy-pass 模式 – 将文件从一个目录复制到另一个目录。 您可以通过 -p--pass-through 选项启用此模式。
注意
tar 命令一样,使用 cpio 命令时需要注意文件列表的保存方式(绝对路径 或 相对路径)。
tar 命令一样,为了安全性考虑,我们不建议您使用绝对路径创建 cpio 归档。

次要功能:

  1. -t – 打印输入的内容表。仅工作在 copy-in 模式
  2. -A – 将一个或多个文件追加到现有归档中。仅工作在 copy-out 模式
  3. -v – 显示详细的处理细节。工作在任意模式。

cpio 中的相关符号:

  1. > :用在 copy-out 模式 中,相当于指定归档文件
  2. < :用在 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
看懂命令的手册页
在 GNU/Linux 的帮助系统中,请注意:

* “{ }” 表示是必需的;
* “|” 表示或的意思;
* “[ ]” 表示是可选的;
* “…” 表示同样的对象可以有多个;
* “< >” 表示是可以变化的;
* 粗体表示必须按照原始样式输入;
* 斜体或下划线则表示需要使用适当的值进行替换;
* “[ | | ]” 表示两个或多个的选项,用户需要选择其中的任意一个。

copy-out 模式的示例

  1. 使用 find 命令将绝对路径的文件列表传递给 cpio

    Shell > find /etc/ | cpio -ov > /tmp/etc.A.cpio
  2. 使用 ls 命令将相对路径的文件列表传递给 cpio

    Shell > cd /var/log/ ; ls | cpio -ov > /tmp/log.cpio
  3. 使用 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
  1. 将一个或多个文件追加到现有归档中

    Shell > find /etc/yum.* | cpio -o -A -F /tmp/custom.A.cpio
笔记
追加时,您必须使用 -F-O 选项。
注意
若已有归档使用的是绝对路径的文件列表,则追加时也应该使用绝对路径的文件列表。

copy-in 模式的示例

选项:

  • -E – 指定 pattern 以提取指定需要的文件。pattern 即单个文件内容中的文件列表。
  • -u – 无条件地替换所有文件。该选项可以工作在 copy-in 模式或 copy-pass 模式。
  1. 查看归档文件的内容

    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
  2. 从归档文件中提取部分文件

    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
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci"
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇