1 压缩工具

1.1 compress/uncompress

Linux compress命令是一个相当古老的 unix 文件压缩指令 , 压缩后的文件会加上一个 .Z 延伸档名以区别未压缩的档案 , 压缩后的文件可以以 uncompress 解压。若要将数个档案压成一个压缩档 ,必须先将文件 tar 起来再压缩。由于 gzip 可以产生更理想的压缩比例 , 一般人多已改用 gzip 为档案压缩工具。

对应rpm包名:ncompress-4.2.4.4-13.el8.x86_64

  • 语法 : compress [-dfvcVr] [-b maxbits] [file ...]

  • 选项

    • -d: 解压缩 , 相当于uncompress

    • -c: 结果输出至标准输出,不删除原文件

    • -v : 显示详情

    • -b : 设定共同字串数的上限 , 以位元计算 , 可以设定的值为 916 bits 。由于值越大 , 能使用的共同字串就 越多 , 压缩比例就越大 , 所以一般使用预设值 16 bits (bits)

  • uncompress : 解压缩

示例

#压缩文件
[root@centos8 ~]# compress -f anaconda-ks.cfg 
[root@centos8 ~]# compress -c anaconda-ks.cfg  > anaconda-ks.cfg.Z
[root@centos8 ~]# ll
total 8
-rw------- 1 root root 1101 Aug 16 16:07 anaconda-ks.cfg
-rw-r--r-- 1 root root  854 Aug 17 15:50 anaconda-ks.cfg.Z
drwxr-xr-x 5 root root  113 Aug 16 17:22 vuepress-starter
​
#解压文件
[root@centos8 ~]# uncompress anaconda-ks.cfg.Z 
​
#预查看压缩文件中的内容
[root@centos8 ~]# zcat anaconda-ks.cfg.Z 
#version=RHEL8
# Use graphical install
graphical
...
​
​
#另外一种解压方式
[root@centos8 ~]# zcat anaconda-ks.cfg.Z > anaconda-ks.cfg

1.2 gzip/gunzip

Linux gzip命令用于压缩文件。gzip是个使用广泛的压缩程序 , 文件经它压缩过后 , 其名称后面会多出.gz的扩展名。

  • 语法 :gzip [OPTION]... FILE ...

  • OPTIONS

    • -d : 解压缩 , 相当于gunzip

    • -c : 将压缩或解压缩的结果输出至标准输出

    • -# : 1-9 , 指定压缩比 , 值越大压缩比越大

    • -S : 指定压缩包的后缀名。如果不是默认后缀名.gz-gz时则需要使用该选项指定后缀名。

  • gunzip解压时,需要识别压缩包的后缀,gunzip可以识别并解压的后缀名:.gz, -gz, .z, -z,_z

  • zcat : 不显式解压缩的前提下查看文本文件内容

示例 :

#压缩文件
[root@centos7 ~]# gzip anaconda-ks.cfg 
[root@centos7 ~]# gzip -c anaconda-ks.cfg > anaconda-ks.cfg.gz
​
#解压文件
[root@centos7 ~]# gunzip anaconda-ks.cfg.gz 
[root@centos7 ~]# gzip  -d anaconda-ks.cfg.gz 
[root@centos7 ~]# gunzip -c -d anaconda-ks.cfg.gz >anaconda-ks.cfg
[root@centos7 ~]# ls
anaconda-ks.cfg  anaconda-ks.cfg.gz
[root@centos7 ~]# zcat anaconda-ks.cfg.gz > anaconda-ks.cfg
​
​
#预先查看压缩文件内容
[root@centos7 ~]# zcat anaconda-ks.cfg.gz 
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
...
​
#查看压缩比例
[root@centos7 ~]# gzip anaconda-ks.cfg
[root@centos7 ~]# ls
anaconda-ks.cfg.gz
[root@centos7 ~]# gzip  -l *
​
gzip: anaconda-ks.cfg.bz2: not in gzip format
         compressed        uncompressed  ratio uncompressed_name
                717                1242  45.0% anaconda-ks.cfg
                717                1242  45.0% (totals)
​
​

1.3 bzip2/bunzip2

Linux bzip2命令是.bz2文件的压缩程序。

bzip2采用新的压缩演算法 , 压缩效果比传统的LZ77/LZ78压缩演算法来得好。若没有加上任何参数 , bzip2压缩完文件后会产生.bz2的压缩文件 , 并删除原始的文件。

  • 语法 : bzip2 [OPTION]... FILE ...

  • OPTIONS

    • -k: keep, 保留原文件

    • -c/--stdout : 将压缩与解压缩的结果送到标准输出。

    • -f/--force : bzip2在压缩或解压缩时 , 若输出文件与现有文件同名 ,预设不会覆盖现有文件。若要覆盖 ,请使用此参数。

    • -t/--test : 测试.bz2压缩文件的完整性。

    • -d : 解压缩

    • -# : 1-9 , 压缩比 , 默认为9

  • bunzip2 : 解压压缩文件。命令识别的后缀名:.bz2, .bz, .tbz2 ,.tbz

  • bzcat : 不显式解压缩的前提下查看文本文件内容

解压时文件名变化

压缩文件

解压文件

filename.bz2

filename

filename.bz

filename

filename.bz2

filename.tar

filename.tbz

filename.tar

anyothername

anyothername.out

示例 :

#压缩文件
[root@centos7 ~]# bzip2 anaconda-ks.cfg 
[root@centos7 ~]# bzip2 -c anaconda-ks.cfg  > anaconda-ks.cfg.bz2
​
#直接使用-c选项时,会提示以下内容,并不会将内容输出至屏幕中。
[root@centos7 ~]# bzip2 -c anaconda-ks.cfg 
bzip2: I won't write compressed data to a terminal.
bzip2: For help, type: `bzip2 --help'.
​
​
#解压文件
[root@centos7 ~]# bunzip2 anaconda-ks.cfg.bz2
[root@centos7 ~]# bzip2 -d anaconda-ks.cfg.bz2 
[root@centos7 ~]# bzip2 -c -d anaconda-ks.cfg.bz2 > anaconda-ks.cfg
​
[root@centos7 ~]# mv anaconda-ks.cfg.bz2 anaconda-ks.cfg.1
[root@centos7 ~]# bunzip2 anaconda-ks.cfg.1
bunzip2: Can't guess original name for anaconda-ks.cfg.1 -- using anaconda-ks.cfg.1.out
[root@centos7 ~]# ls
anaconda-ks.cfg  anaconda-ks.cfg.1.out 

1.4 xz/unxz

XZ Utils 是为 POSIX 平台开发具有高压缩率的工具。它使用 LZMA2 压缩算法 , 生成的压缩文件比 POSIX 平台传统使用的 gzipbzip2 生成的压缩文件更小 , 而且解压缩速度也很快。

压缩完成后 , 系统会自动在原文件后加上.xz的扩展名并删除原文件。xz命令只能对文件进行压缩 , 不能对目录进行压缩。

这类命令主要用于压缩或解压.xz.lzma文件

  • 语法 : xz [OPTION]... FILE ...

  • OPTIONS

    • -k : keep, 保留原文件

    • -c/--stdout : 将压缩与解压缩的结果送到标准输出。

    • -d : 解压缩

    • -S : 指定压缩包的后缀名。

    • -# : 1-9 , 压缩比 , 默认为6

    • -t,--test : 测试压缩文件的完整性

    • -l,--list : 列出有关.xz文件的信息

    • -k, --keep : 保留(不要删除)输入文件

    • -f, --force : 强制覆盖输出文件和(解)压缩链接

    • -v : 显示详细信息

    • -F,--format : 压缩或者解压文件时指定为特定的类型文件。支持的类型: raw,xz,lzma,auto

  • xzcat : 不显式解压缩的前提下查看文本文件内容

  • unxz : 解压文件

  • xzdec : 将文件中的内容输出至屏幕中。类似于xzcat

  • xzmore :使用more命令查看xz压缩之后的文件。

  • xzless : 使用less命令查看xz压缩之后的文件。

  • xzgrep,xzegrep,xzfgrep : 使用正则表达式筛选文件中的内容。

示例 :

[root@centos8 ~]# xzgrep -w "timezone" anaconda-ks.cfg.xz 
# System timezone
timezone Asia/Shanghai --isUtc --nontp
​
#压缩文件
[root@centos8 ~]# xz anaconda-ks.cfg 
​
#压缩文件为指定的模式
[root@centos8 ~]# xz -F lzma anaconda-ks.cfg 
[root@centos8 ~]# ls
anaconda-ks.cfg.lzma
​
#压缩文件并保留原文件
[root@centos8 ~]# xz -c anaconda-ks.cfg  > anaconda-ks.cfg.xz
[root@centos8 ~]# xz -k anaconda-ks.cfg 
​
​
#解压文件
[root@centos8 ~]# unxz anaconda-ks.cfg.xz 
[root@centos8 ~]# xz -F lzma -d anaconda-ks.cfg.lzma

1.5 zip/unzip

zip是个使用广泛的压缩程序 , 压缩后的文件后缀名为 .zip

  • 语法 : zip [options] .zip压缩文件 file...

  • options

    • -d : 从压缩文件内删除指定的文件。

    • -f : 更新现有的文件。

    • -m : 将文件压缩并加入压缩文件后 , 删除原始文件 , 即把文件移到压缩文件中。

    • -r : 递归处理 , 将指定目录下的所有文件和子目录一并处理。

    • -x : ”文件列表“ , 压缩时排除文件列表中的文件

    • -q : 不显示指令执行过程。

示例: 压缩文件命令

#-r 主要用于将目录页添加至压缩包中,如果命令后面均为文件,则不需要加-r
[root@centos7 ~]# zip -q  -r etc.zip /etc
​
#将/etc/目录下 , 除了fstab 文件之外所有文件 , 均放置在压缩包中
[root@centos7 etc]# zip -q -r etc.zip /etc/ -x /etc/fstab 
​
#删除压缩包中etc/motd文件
[root@centos7 ~]# zip -d etc.zip etc/motd
deleting: etc/motd
​
#将anaconda-ks.cfg添加到etc.zip的压缩包中。
[root@centos7 ~]# zip   -m  etc.zip anaconda-ks.cfg 
  adding: anaconda-ks.cfg (deflated 45%)
​

可以使用unzip解压。unzip使用方式如下:

  • 语法 : unzip [-Z] [-cflptTuvz[abjnoqsCDKLMUVWX$/:^]] file[.zip] [file(s) ...] [-x xfile(s) ...] [-d exdir]

  • options

    • -l : 列出压缩文件所包含的内容

    • -v : 显示详细的执行过程

    • -o : 不提示的情况下覆盖文件;

    • -d : 文件解压至指定的文件夹中

    • -t : 检查压缩文件是否正确。

    • -p : 会将解压缩的结果显示到屏幕上 , 但不会执行任何的转换。

示例

#压缩解压文件
[root@centos8 ~]# cat /var/log/messages | zip messages  - 
[root@centos8 ~]# ls
-  anaconda-ks.cfg  messages.zip
[root@centos8 ~]# unzip -p messages.zip
​
#查看压缩文件信息
[root@centos8 ~]# unzip -l anaconda-ks.cfg.zip 
Archive:  anaconda-ks.cfg.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     1101  08-16-2021 16:07   anaconda-ks.cfg
---------                     -------
     1101                     1 file
[root@centos8 ~]# unzip -l messages.zip 
Archive:  messages.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
   192075  08-18-2021 16:35   -
---------                     -------
   192075                     1 file
​
#检查压缩文件是否完整
[root@centos8 ~]# unzip -t anaconda-ks.cfg.zip 
Archive:  anaconda-ks.cfg.zip
    testing: anaconda-ks.cfg          OK
No errors detected in compressed data of anaconda-ks.cfg.zip.
​
#解压文件
[root@centos8 ~]# unzip -p anaconda-ks.cfg.zip  > anaconda-ks.cfg
​
#将文件解压至/tmp目录中。
[root@centos8 ~]# unzip -o -d /tmp  anaconda-ks.cfg.zip 
Archive:  anaconda-ks.cfg.zip
  inflating: /tmp/anaconda-ks.cfg    
​

2 归档工具

2.1 tar

Tar(Tape ARchive , 磁带归档的缩写) 。tar命令可以为linux的文件和目录创建档案。利用tar , 可以为某一特定文件创建档案( 备份文件) , 也可以在档案中改变文件 , 或者向档案中加入新的文件。tar最初被用来在磁带上创建档案 , 现在 , 用户可以在任何设备上创建档案。利用tar命令, 可以把一大堆的文件和目录全部打包成一个文件 , 这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。

首先要弄清两个概念 : 打包和压缩。打包是指将一大堆文件或目录变成一个总的文件 ; 压缩则是将一个大的文件通过一些压缩算法变成一个小文件。

Linux中很多压缩程序只能针对一个文件进行压缩 , 这样当你想要压缩一大堆文件时 , 你得先将这一大堆文件先打成一个包(tar命令) , 然后再用压缩程序进行压缩(gzipbzip2命令)。

  • 语法 :

    • Traditional usage : tar {A|c|d|r|t|u|x}[GnSkUWOmpsMBiajJzZhPlRvwo] [ARG...]

    • UNIX-style usage

      • tar -A [OPTIONS] ARCHIVE ARCHIVE

      • tar -c [-f ARCHIVE] [OPTIONS] [FILE...]

      • tar -d [-f ARCHIVE] [OPTIONS] [FILE...]

      • tar -t [-f ARCHIVE] [OPTIONS] [MEMBER...]

      • tar -r [-f ARCHIVE] [OPTIONS] [FILE...]

      • tar -u [-f ARCHIVE] [OPTIONS] [FILE...]

      • tar -x [-f ARCHIVE] [OPTIONS] [MEMBER...]

    • GNU-style usage

      • tar {--catenate|--concatenate} [OPTIONS] ARCHIVE ARCHIVE

      • tar --create [--file ARCHIVE] [OPTIONS] [FILE...]

      • tar {--diff|--compare} [--file ARCHIVE] [OPTIONS] [FILE...]

      • tar --delete [--file ARCHIVE] [OPTIONS] [MEMBER...]

      • tar --append [-f ARCHIVE] [OPTIONS] [FILE...]

      • tar --list [-f ARCHIVE] [OPTIONS] [MEMBER...]

      • tar --test-label [--file ARCHIVE] [OPTIONS] [LABEL...]

      • tar --update [--file ARCHIVE] [OPTIONS] [FILE...]

      • tar --update [-f ARCHIVE] [OPTIONS] [FILE...]

      • tar {--extract|--get} [-f ARCHIVE] [OPTIONS] [MEMBER...]

  • 操作选项

    • -A, --catenate,--concatenate : 将归档文件附加到另一个归档文件末尾的末尾。所有存档的格式需要相同。

    • -c , --create : 创建一个新的归档文件。目录归档时会按照递归方式处理 , 除非加了--no-recursion参数。

    • --delete : 删除归档文件中指定的文件。

    • -r,--append : 将文件添加至归档的末尾。功能类似于-c

    • -t ,--list : 列出档案的内容。

    • -u , --update : 添加更新的文件至归档文件中。参数和-c-r有同样的含义。需要注意,新添加的文件并不会替换原本的文件,而是附加在文件最后。因此最后生成的归档文件可以包含同名的文件,属于同一个文件的不同版本。

    • -x , --extract , --get : 提取归档文件中指定的文件。如果没有指定需要提取的文件,则提取所有文件。

  • 覆盖控制选项

    • -k, --keep-old-files : 提取时不要替换已存在的文件。

    • --skip-old-files : 提取时不要替换已存在的文件。并且静默跳过这些文件。

    • --keep-newer-files : 提取文件时,不替换比归档包中更新的现有文件。

    • --no-overwrite-dir :保留已存在目录的元数据信息

    • --overwrite-dir : 提取文件时,覆盖目录的元数据信息

    • --overwrite : 提取归档文件中文件时, 允许覆盖已存在的文件。

    • --remove-files : 将文件添加到存档后, 删除掉磁盘中的文件。

  • 压缩选项

    • -a , --auto-compress : 使用存档后缀来确定压缩程序.

    • -I,--use-compress-program=COMMAND :使用COMMAND压缩或解压归档文件。这个命令需要可以接收-d用于解压

    • -j , --bzip2 : 通过bzip2压缩解压归档文件。识别归档后缀:.tbz2,.tar.bz2

    • -J , --xz :通过xz压缩解压归档文件。识别归档后缀: .txz,.tar.xz

    • --lzip : 使用lzip压缩解压归档文件

    • --lzma : 使用lzma压缩解压归档文件。识别归档后缀: .tlz,.tar.lzma

    • --lzop : 使用lzop压缩解压归档文件.

    • -z,--gzip,--gunzip,--ungzip :使用gzip压缩解压归档文件。识别归档后缀: .tar.gz,.tgz

    • -Z,--compress,--uncompress : 使用compress 压缩解压归档文件

  • 文件处理选项

    • --add-file=FILE : 添加文件至归档中

    • -C,--direcotry : 执行任何操作时, 切换到指定目录中执行。

    • --exclude=PATTERN : 排除掉PATTERN匹配到的文件,PATTERN是按照glob匹配的。

    • --recursion :递归调用目录里面的文件(默认)。

    • -X, --exclude-from=FILE : 在匹配的模式中排除掉指定文件。

示例

#将文件添加至归档文件中
[root@centos8 ~]# tar cvf init.tar anaconda-ks.cfg messages test.html 
anaconda-ks.cfg
messages
test.html
​
#创建归档文件,并压缩至gzip格式
[root@centos8 ~]# tar  zcvf init.tar.gz  /var/log/messages 
tar: Removing leading `/' from member names
/var/log/messages
#如果指定的需要归档的文件中含有根目录时,就会有以上提示内容。/var/log/messages加入到归档包时会除掉根目录直接的归档的目录为var/log/messages
​
#将init.tar中的文件内容添加到age.tar归档文件中。
[root@centos8 ~]# tar -Af age.tar init.tar 
​
#将test.html文件添加到init.tar归档文件中
[root@centos8 ~]# tar -rf  init.tar test.html 
​
#查看init.tar归档文件中的内容
[root@centos8 ~]# tar -tf init.tar 
anaconda-ks.cfg
messages
test.html
​
#提取init.tar文件中的anaconda-ks.cfg出来
[root@centos8 ~]# tar -f init.tar -x anaconda-ks.cfg
​
#解压并提取压缩包中的文件
[root@centos8 ~]# tar -xf init.tar.gz 
​
#解压提取压缩包中的文件,并将文件放置在/tmp目录中
[root@centos8 ~]# tar -xf init.tar.gz  -C /tmp/
​
​
#压缩归档文件
[root@centos8 ~]# tar -zcvf messages.tgz messages 
messages
[root@centos8 ~]# tar -zxvf  messages.tgz 
messages
​

2.2 cipo

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

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

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

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

  • cpio有三种运行模式:

    • Copy-out模式 : 此模式下 , cpio将向归档文件中拷入文件 , 即进行归档操作,所以称为归档模式。它会从标准输入中读取待归档的文件 , 将它们归档到目标目标中 ,若未指定归档的目标 , 将归档到标准输出中。

      copy-out模式下 , 最典型的是使用find来指定待归档文件 , 在使用find时 ,最好加上-depth以尽可能减少可能出现的问题 ,例如目录的权限问题。

    • Copy-in模式 : 此模式下 , cpio将从归档文件中提取文件 ,或者列出归档文件中的文件列表。

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

    • Copy-pass模式 : 此模式下 , cpio拷贝一个目录树(即目录中所有文件)到另一个目录下 , 并在目标目录下以同名的子目录存在。

      copy-pass模式是copy-in模式再copy-out模式的结合 , 它中途没有涉及到任何归档行为。这是cpio的一个特殊用法 : 它从标准输入中读取待拷贝内容 , 然后将它们复制到目标路径下。

  • 使用

    • cpio [选项] > 文件名或者设备名

    • cpio [选项] < 文件名或者设备名

  • 选项

    • -o ,--create : 指定运行为copy-out模式 , 即归档模式。将文件拷贝打包成文件或者将文件输出到设备上 。

    • -i ,--extract : 指定运行为copy-in模式 , 即提取模式。解包 , 将打包文件解压或将设备上的备份还原到系统。

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

    • -t ,--list : 列出归档文件中的文件列表。查看归档文件内容或者输出到设备上的文件内容。

    • -B : 设置I/Oblock大小为5120字节 , 默认为512字节

    • -C IO-SIZE ,--io-size=IO-SIZE : 指定I/Oblock大小为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 : 仅拷贝不匹配指定pattern的文件

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

    • -a ,--reset-access-time : 保留原始的atime

    • -m ,--preserve-modification-time : 保留文件的原始mtime

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

    • -0,--null : 解析空字符串\0, 和find命令的--print0一起使用,保证文件名搜索时正确的。

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

    • -v : 给出详细信息

使用示例

  1. 将家目录下的所有文件都归档到home.cpio中。这里-o选项表示归档模式,创建归档文件, -v显示详细信息, -F 指定归档文件名

    $ find ~ -depth | cpio -ov > home.cpio
    # 或
    $ find ~ -depth | cpio -ov -F home.cpio

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

    find家目录的所有文件都归档到home.cpio ,但home.cpio也将是放在家目录下的 , 它也会被find 搜索到 , 所以也会被归档到其自身中去。原因是由于管道的作用只是进程间数据传递的作用 , 但不是一定要等管道左边的处理完成之后才传递 , 而是左边边处理边传递到右边的 , 如果左边处理的太快 , 将导致管道拥堵 , 那么管道左边的程序将等待管道有空闲空间。

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

    $ find ~ -depth | cpio -ov -F /tmp/home.cpio

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

    $ find ~ -depth -print0 | cpio --null -ov -F /tmp/tree.cpio
  2. 列出归档文件中的文件列表。

    $ cpio -t -F home.cpio
    # 或
    $ cpio -t < home.cpio
    ​
    #内容预览 
    cpio –tv < etc.cpio 

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

    $ cpio -t -F home.cpio /root/*
    # 或
    $ cpio -t /root/* < home.cpio

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

    $ cpio -t -F home.cpio /root/.*

    这样又只会列出隐藏文件。

    $ cpio -t -F home.cpio /root/{.*,*}

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

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

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

    $ ls /root/new.txt | cpio -oA -F tree.cpio

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

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

    $ find /boot -depth -print0 | cpio -oA -F tree.cpio

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

  4. 提取文件

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

    $ cpio -idv -F tree.cpio /root/new.txt
    cpio: new.txt not created: newer or same age version exists

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

    $ cpio -idvu -F tree.cpio new.txt

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

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

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

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

    find ~ -depth -print0 | cpio --null -pvd /tmp/abc
    ​
    $ ll /tmp/abc
    dr-xr-x--- 6 root root 4096 Jun 13 09:45 root


参考链接

Linux命令大全:tar命令

骏马金龙:cpio归档工具的用法详细说明


熊熊