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

ian*_*215 44 zfs cpio tar archiving bzip2

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

CPIO 与 TAR 有何不同?我在另一个问题中被告知 tar 用于将许多文件合并到 1 个存档中,然后通常是 gzip'd 或 bzip'd。

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

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

这是我在阅读了有关备份 ZFS 快照的 Oracle 文档后想到的那种命令。

# 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
Run Code Online (Sandbox Code Playgroud)

ktf*_*ktf 65

除了之前grawityPaul所说的:

历史

在“过去”,cpio(使用选项-c)是将文件移动到其他 UNIX 衍生物时使用工具,因为它比tar更便携和灵活。但是tar可移植性问题可以认为自 1980 年代后期以来已解决。

不幸的是,大约在那个时候,不同的供应商修改了cpio-c格式(只需查看GNU cpio的手册页和选项)。那时tar变得比cpio更具可移植性……直到不同的 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
Run Code Online (Sandbox Code Playgroud)

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

另外的GNU tar提供了选项-z导致与被压缩归档GNU拉链上的苍蝇,使事情变得更加容易。

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

GNU tar的人们花费了大量精力来包含许多以前只能使用cpio才能实现的功能。事实上,这两种工具都是相互学习的——但只有cpio可以读取tar的格式——而不是相反。

tar和输出处理

对你所说的最后一句话:

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

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

 $ tar cvf - myfiles | bzip > myfiles.tar.bz
Run Code Online (Sandbox Code Playgroud)

此外,GNU tar提供了--to-command指定后处理器命令的选项- 尽管我仍然更喜欢管道。也许它在写入某些硬件设备时有用。

  • _“如果已经有一个工具可以处理几乎所有人们能想到的问题,为什么还要将目录树搜索包含在 cpio 中”_ 好问题,但是您还必须要求它复制 (`cp`)、移动 (`mv `)、`diff` 等;-) (4认同)

use*_*686 29

双方tarcpio有一个目的:串连许多单独的文件到一个单一的数据流。他们不压缩数据。(tar由于其相对简单,现在更受欢迎——它可以将输入文件作为参数,而不必findcpio以前那样耦合。)

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

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

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

gzip -dc ~/backups/20070607.gz | zfs receive media/mypictures@20070607
Run Code Online (Sandbox Code Playgroud)

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


Pau*_*aul 6

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

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

tar 确实可以在 stdin 上输入并输出到 stdout - 然后会像您一样通过管道传输到 bzip2 或类似的东西。如果使用“z”选项调用,它将自动在输出上调用 gzip。

  • 当您使用选项 -a 时,最新版本的 GNU tar 甚至可以从存档文件名中猜测所需的压缩格式。所以这个:`tar -caf myfiles.tar.xz myfiles/` 将使用 `xz` 进行压缩,而这个 `tar -caf myfiles.tar.gz myfiles/` 将使用 `gzip` 进行压缩。 (4认同)
  • 是的,-j 是 bzip2 并且一些(更反感?)版本将 -J 作为 xv,对于 GNUtar 那就是 (2认同)

小智 5

另外值得注意的是:(至少)在 FreeBSD 和 Mac OS X 上,您可以使用 tar 操作 cpio 文件。BSD tar 在底层使用 libarchive,因此它可以处理 cpio、pax、shar...

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


小智 5

我在加州询问了惠普技术支持。1996年为什么使用cpiotar

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

我从未见过支持这一点的文档,但总是使用cpio.