cpio VS tar和cp

我刚刚了解到cpio有三种模式:复制,复制和传递。

我想知道在拷贝和copy-in模式下cpio比tar有什么优点和缺点。 何时使用cpio以及何时使用tar?

传递模式下的cpio与cp类似的问题

感谢致敬!

这是一个非常通用的概述:

CPIO更好地复制文件系统,包括备份。 它保留了像硬链接,fifo和其他非标准文件function的东西。 CPIO的大部分实现都是TAR所做的,包括读写.tar文件。 CPIO通常会将标准input文件列表存档; 这使得从别的东西pipe道列表(如find )非常容易。

如果您想要从目录A复制到目录B的文件列表很长,则CPIO透传非常有用(例如,您可以使用find查找系统上最近2年内发生更改的所有文件)

TAR将所有标准文件从磁带(或存档文件)中简单地转储出去做得更好。 使用(对于大多数常见任务)更简单一些。 它轻松满足大多数人简单的备份需求; 而且大部分的受欢迎程度都来自于这个事实。

而现在的细则。 CPIO和TAR有几个不同的版本和实现。 每个人都有不同的function,有些人有不同的命令行选项。 有些事情可以在其他事情做不到的地方做; 如果你发现自己受限于一个,请尝试另一个。 每个人都有一个最喜欢的,99%的时间要么完成任务。

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

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

我也比较喜欢CPIO。 但是,对未知来源的文件集(如最终用户创build的文件)使用cpio ,最好使用NUL终止的文件名:使用-print0标志向cpio查找并添加0标志。 这种方式文件奇怪的名称(如包括CRNL字符)将被正确处理。

 cd / && find . -xdev -print0 | cpio -pmdu0 /mnt/ 

除了通过disrpm或rpm2cpio翻录打开的RPM文件之外,我没有理由使用cpio,但是可能会出现cpio比tar更好的情况。

历史和人气

tar和cpio都是1979年版本的Unix中引入的竞争存档格式,然后包含在POSIX.1-1988中,尽pipe只有tar保留在下一个标准POSIX.1-2001中。

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

焦油更为普遍的知名度,多年来已经变得更加多才多艺,并且更有可能得到特定系统的支持。 Cpio仍然在less数领域使用,例如红帽软件包格式(RPM),尽pipeRPM v5 (这是公认的模糊)使用xar而不是cpio。

两者都适用于大多数类Unix系统,尽pipetar更常见。 这里是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) 

模式

复制 :这是为了创build档案,类似于tar -pc

复制 :这是为了存档提取,类似于tar -px

传递 :这基本上都是上面的,类似于tar -pc … |tar -px但在一个命令中(因此显微镜更快)。 它类似于cp -pdr ,尽pipecpio和(尤其是)tar都具有更多的可定制性。 另外考虑一下rsync -a ,人们通常会忘记它,因为它更常用于networking连接。

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