cpio 与 tar 和 cp

cpio 与 tar 和 cp

我刚刚了解到 cpio 有三种模式:copy-out、copy-in 和 pass-through。

我想知道在复制输出和复制输入模式下,cpio 相对于 tar 有哪些优点和缺点。什么时候使用 cpio 更好,什么时候使用 tar 更好?

直通模式下 cpio 与 cp 存在类似的问题。

感谢致敬!

答案1

这是一个非常笼统的概述:

CPIO 在复制文件系统(包括进行备份)方面做得更好。它保留了诸如硬链接、fifo 和其他非标准文件功能之类的内容。大多数 CPIO 实现都可执行 TAR 所做的所有操作,包括读取和写入 .tar 文件。CPIO 通常从标准输入获取文件列表以存档;这使得从其他内容(例如find)传输列表变得非常容易。

如果您需要将一长串文件从目录 A 复制到目录 B,那么 CPIO 直通就非常有用。(例如,您可以使用它find来查找系统上过去 2 年内发生更改的所有文件)

TAR 可以更好地将所有标准文件转储到磁带(或存档文件)或从磁带(或存档文件)转储。它使用起来更简单一些(对于大多数常见任务而言)。它可以轻松满足大多数人的简单备份需求;它之所以如此受欢迎,很大程度上就是因为这个事实。

现在来看看细节。CPIO 和 TAR 都有几种不同的版本和实现。每个版本都有不同的功能,有些版本有不同的命令行选项。有些功能每个版本都能做,而其他版本做不到;如果你发现自己受其中一个版本限制,那就试试另一个版本。每个人都有自己喜欢的版本,99% 的情况下,任何一个版本都能完成任务。

答案2

在 AE 3 redhat 上,我发现 cpio 的输出流大小限制为 2 GB。但是 tar 没有这个限制。

其他系统可能有不同的限制。

答案3

我从评论和其他背景中了解到,cpio现在这种做法已经不那么普遍了,而且各个版本之间也不一致。但它cpio有一个优点,我最近发现它在处理大量损坏的 tar 档案时非常有用。它不会在 tar 文件中出现第一个错误时停止,而是尝试跳过坏数据并尽可能多地提取数据。例如,

tar xf ./sample.corrupt.tar

将打印

tar: Skipping to next header
tar: Exiting with failure status due to previous errors

在第一次遇到错误之后,而

cpio -F ./sample.corrupt.tar -i -v

将打印提取的文件并针对每个错误打印:

cpio: invalid header: checksum error
cpio: warning: skipped 6 bytes of junk

cpio: invalid header: checksum error
cpio: warning: skipped 2 bytes of junk

etc...

tar 格式要求每个档案头都对齐在 512 边界上,但如果损坏导致头未对齐,cpio则会尽最大努力提取尽可能多的内容

答案4

我认为除了通过以下方式翻录打开的 RPM 文件之外,没有理由使用 cpio转速或者rpm2cpio但是,在某些特殊情况下,cpio 可能比 tar 更可取。

历史和受欢迎程度

两个都柏油太平洋保险协会是引入的竞争存档格式版本 7 Unix1979 年,并被纳入POSIX.1-1988,但在下一个标准 POSIX.1-2001 中只剩下 tar1

Cpio 的文件格式已多次更改,并且版本之间并不完全兼容。例如,现在有一种二进制文件信息数据的 ASCII 编码表示。

Tar 更为人熟知,多年来变得更加通用,并且更有可能在给定系统上得到支持。Cpio 仍在一些领域使用,例如Red Hat 软件包格式(RPM),RPM 版本(确实很模糊)用途西尔而不是 cpio。

两者都存在于大多数类 Unix 系统中,但 tar 更常见。以下是Debian 的安装统计

#rank  name    inst    vote    old  recent  no-files  (maintainer)
   13   tar  189206  172133   3707   13298        68  (Bdale Garbee)
   61  cpio  189028   71664  96346   20920        98  (Anibal Monsalve Salazar)

模式

复印件:用于创建档案,类似于tar -pc

拷入:用于档案提取,类似于tar -px

直通:这基本上是上述两种命令的结合,类似于tar -pc … |tar -px但包含在单个命令中(因此速度要快得多)。它类似于cp -pdr,但 cpio 和(尤其是)tar 都具有更多的可定制性。另外请考虑rsync -a,人们经常忘记它,因为它通常用于网络连接。

我没有比较过它们的性能,但我预计它们在 CPU、内存和档案大小(压缩后)方面会非常相似。

相关内容