TAR和CPIO存档文件格式之间有什么区别?


41

我很好奇,做了一些阅读,但仍然有疑问。

是什么使CPIO与TAR不同?在另一个问题中,有人告诉我tar是用于将许多文件合并到1个存档中的,然后通常使用gzip或bzip压缩。

还告诉我TAR无法从STDOUT压缩。我想存档/压缩ZFS快照进行备份。我想知道是否可以将CPIO与bzip2结合使用以获得这种效果。

还是我有一个完全错误的想法?那不是CPIO的目的吗?

这是我在阅读有关Oracle文档备份ZFS快照后提出的命令。

# Backup snapshot to cpio and bzip2 archive
zfs send media/mypictures@20070607 | cpio -o | bzip2 -9c > ~/backups/20070607.bz2

# Restore snapshot from cpio and bzip2 archive
zfs recieve media/mypictures@20070607 | cpio -i | bunzip2 -c ~/backups/20070607.bz2

别忘了pax:P
Janus Troelsen

Answers:


28

双方tarcpio有一个目的:串连许多单独的文件到一个单一的数据流。他们不压缩数据。(这些天tar是更受欢迎,因为它相对简单-它可以采取输入文件作为参数,而不必被加上find作为cpio具有)。

就您而言,您不需要这些工具中的任何一个。它们不会产生有用的效果,因为您没有很多单独的文件。zfs send已经做了本来会做的同样的事情tar因此,您没有任何文件,只有一个无名流。

要压缩快照,您要做的就是zfs通过压缩程序通过管道传递输出:

zfs send media/mypictures@20070607 | gzip -c > ~/backups/20070607.gz

gzip -dc ~/backups/20070607.gz | zfs receive media/mypictures@20070607

(如果需要,可以gzipxzbzip2或任何其他流压缩工具代替。)


哦,我知道了,所以我的ZFS输出不是文件数据流吗?这样就可以解释为什么Oracle示例在命令中不包含TAR。
ianc1215 2011年

1
@Solignis:您可以这样想:zfs send已经做过与会做的一样tar
grawity 2011年

62

除了grawfulPaul之前所说的以外

历史

在过去,cpio(使用了选项-c)是将文件移动到其他UNIX派生版本时要使用工具,因为它比tar具有更高的可移植性和灵活性。但是自1980年代末以来,焦油可携带性问题可能被认为已经解决。

不幸的是,大约在那个时候,不同的供应商弄乱了cpio-c格式(只需查看GNU cpio的手册页和option )。那时tarcpio更具可移植性...差不多花了整整十年的时间,直到不同的UNIX供应商解决了这个问题。拥有的GNU tarGNU的cpio安装是为这不得不应付来自不同来源的磁带所有的管理员必须在那时(甚至现在我相信)。-H

用户界面

tar可以使用磁带配置文件,管理员可以在其中配置连接到系统的磁带驱动器。然后,用户只需说“我将带上磁带机1”即可,而不必记住磁带的确切设备节点(这可能非常令人困惑,并且在不同的UNIX平台上也无法使用。

但是主要区别是:

tar能够自己搜索目录,并从命令行参数获取要备份的文件或目录的列表。

cpio仅存档被告知的文件或目录,但不会自行递归搜索子目录。cpio也从stdin获取要归档的项目列表,这就是为什么它几乎总是与find结合使用的原因。

的cpio命令的时候,如果相比看起来可怕的初学者焦油

 $ find myfiles -depth -print0 | cpio -ovc0 | gzip -7 > myfiles.cpio.gz
 $ tar czvf myfiles.tar.gz myfiles

我认为这是大多数人使用tar创建存档文件的主要原因:对于诸如捆绑完整目录之类的简单任务,它更易于使用。

另外,GNU tar提供了一个选项-z,该选项使归档文件可以通过GNU zip进行即时压缩,从而使事情变得更加容易。

另一方面,可以使用findcpio做一些漂亮的事情。实际上,这是一种更像UNIX的方法:如果已经有一种工具可以解决几乎所有人都能想到的问题,为什么要在cpio中包括目录树搜索:find。想到的事情只是备份比特定日期新的文件,将文件限制为驻留在同一文件系统中的文件,或者过滤查找输出grep -v以排除某些文件...

GNU tar的人们花费了很多工作来包含很多以前只能由cpio实现的功能。实际上,这两个工具是互相学习的,但只有cpio可以读取tar的格式,而不能相反。

焦油和输出处理

关于您所说的话的最后一点:

还告诉我TAR无法从STDOUT压缩。我想存档/压缩ZFS快照进行备份。我想知道是否可以将CPIO与bzip2结合使用以获得这种效果。

好吧,每个版本的tar(无论是否为GNU)都可以在管道中使用。只需使用减号(-)作为存档名称:

 $ tar cvf - myfiles | bzip > myfiles.tar.bz

另外,GNU tar提供了--to-command指定后处理程序命令的选项-尽管我仍然希望使用管道。也许在写入某些硬件设备时有用。


是不是“来自STDIN”会有所不同,而不是“到STDOUT”。.“从STDOUT”对我来说真的没有意义
Joakim Elofsson

好吧,我只是在引用最初的问题。的想法-它有点措辞不一,但我认为这是正确的。
ktf

3
“如果已经有一种工具可以解决几乎所有人都能想到的问题,为什么要在cpio中包括目录树搜索”,这是一个好问题,但是您还必须要求它提供复制(cp),移动(mvdiff等;- )
Mecki 2013年

1
长号英雄BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar。您已经说过:only cpio may read the format of tar。这不是矛盾吗?
n611x007 2015年

6

tar和cpio具有基本相同的功能,即从多个文件和目录的输入创建单个连续文件。最初,这是将结果放到磁带上,但是如今,它们通常像上面一样用于馈入压缩实用程序。这是因为压缩单个大文件比压缩​​许多小文件更节省时间和空间。您应该注意,许多图像格式(png,jpg等)已经高度压缩,并且如果通过压缩实用程序放置,实际上可能会变得更大。

tar或cpio本身都不做任何压缩。Tar有效地赢得了“我们将使用什么来制作聚合文件”之战,但是cpio在各个地方都得到了关注。我不知道一个相对于另一个有什么好处,因为tar通过更常用而获胜。

tar确实可以在stdin上接受输入,然后输出到stdout-然后像您所拥有的或类似的东西将其通过管道传送到bzip2中。如果使用“ z”选项调用,它将自动在输出中调用gzip。


1
是的,不是-j要调用bzip2吗?
ianc1215 2011年

2
是的,-j是bzip2,某些版本(更讨厌?)的-J作为xv,是GNUtar的
Joakim Elofsson

4
使用选项-a时,最新版本的GNU tar甚至可以从存档文件名称中猜测所需的压缩格式。所以this:tar -caf myfiles.tar.xz myfiles/将使用压缩,xz并且tar -caf myfiles.tar.gz myfiles/将使用压缩gzip
盖洛斯2015年

5

我询问了约HP的技术支持。1996年为什么使用cpio结束tar

有人告诉我,磁带会拉伸并磨损。当tar到达磁带的不可读部分时,它将失败并返回错误号。当cpio到达不可读部分时,它将继续到下一个可读块,然后重新同步并继续。

我从未见过文档来支持此操作,但始终使用cpio


根据该帖子,焦油的按位损坏似乎仅限于它影响的区域/文件,与您对cpio所说的相同。 oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap

4

同样值得注意的是:(至少)在FreeBSD和Mac OS X上,您可以使用tar处理cpio文件。BSD tar在后台使用libarchive,因此它可以处理cpio,pax,shar ...

这意味着该cpio命令的可用性问题不必阻止您与cpio文件进行交互。


ktf only cpio may read the format of tar。您已经说过:BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar。这不是矛盾吗?
n611x007 2015年

1
@ n611x007这个答案是关于BSD tar的。另一个可能正在谈论GNU tar。他们是不同的程序。
纳文

3

虽然答案已经在这里比较cpiotar非常好,我想强调的一个cpio的功能叫做管道模式,这使得它更有效地复制选择性文件(即通过find和过滤器),同时保留自己的目录结构。此功能已得到充分证明,其基本前提如下:

find . <predicates> | cpio -pdmv /destination/dir

与等价的内容tar涉及以下内容:

find . <predicates> | tar -T - -cf - | (cd /destination/dir; tar xvf -)

当然还有其他选择,例如rsynccp --parents其他主题中讨论过,但是没有什么比得上find和组合提供的灵活性cpio。由于tar无处不在创建档案,这是我仍然使用的唯一原因cpio

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.