我刚刚了解到 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、内存和档案大小(压缩后)方面会非常相似。