除了grawful和Paul之前所说的以外:
历史
在过去,cpio(使用了选项-c
)是将文件移动到其他UNIX派生版本时要使用的工具,因为它比tar具有更高的可移植性和灵活性。但是自1980年代末以来,焦油可携带性问题可能被认为已经解决。
不幸的是,大约在那个时候,不同的供应商弄乱了cpio的-c
格式(只需查看GNU cpio的手册页和option )。那时tar比cpio更具可移植性...差不多花了整整十年的时间,直到不同的UNIX供应商解决了这个问题。拥有的GNU tar和GNU的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进行即时压缩,从而使事情变得更加容易。
另一方面,可以使用find&cpio做一些漂亮的事情。实际上,这是一种更像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
指定后处理程序命令的选项-尽管我仍然希望使用管道。也许在写入某些硬件设备时有用。
pax
:P