是否有更聪明的tar或cpio,可以有效地检索存档中存储的文件?


24

tar用来存档一组非常大的bz2文件(多GB)。

如果我tar -tf file.tar用来列出存档中的文件,则需要很长时间才能完成(约10-15分钟)。

同样,完成cpio -t < file.cpio过程需要花费同样长的时间,大约要花几秒钟的时间。

因此,从存档中检索文件(tar -xf file.tar myFileOfInterest.bz2例如,通过)的速度很慢。

是否有一种存档方法,可以随时随地保存存档的“目录”,以便可以快速检索存档中的单个文件?

例如,某种目录存储指向存档中特定字节的指针,以及要检索的文件的大小(以及任何其他特定于文件系统的详细信息)。

是否有一个工具(或参数tarcpio)允许归档中的文件的高效检索?

Answers:


15

tar(以及cpio和afio以及pax和类似程序)是面向流的格式-它们旨在直接流到磁带上或通过管道传输到另一个进程中。虽然从理论上讲,可以在文件/流的末尾添加一个索引,但我不知道有哪个版本(不过这将是一个有用的增强)

它对您现有的tar或cpio归档文件无济于事,但是还有另一个工具dar(“磁盘归档文件”)可以创建包含此类索引的归档文件,并可以使您快速直接访问归档文件中的单个文件。

如果unix / linux-dist中不包含dar,则可以在以下位置找到它:

http://dar.linux.free.fr/


有没有一种方法可以将提取的内容传送到标准输出?看起来有一种方法可以从标准输入中创建存档,但没有一种方法(至少不是直接地)提取到标准输出中。从文档中尚不清楚是否可以执行此操作。您知道如何实现吗?
亚历克斯·雷诺兹

1
不,不知道。我自己实际上并没有使用dar ...我只知道它存在。我对tar感到很满意,并且倾向于只创建列出大型tar文件内容的文本文件,以便以后搜索。你可以在同一时间通过使用v选项两次(如“焦油cvvjf /tmp/foo.tar.bz2 /路径/到/备份> /tmp/foo.txt”)创建tar归档做到这一点
中科院


8

虽然它不存储索引,但star据称要比快tar。另外,它支持更长的文件名,并且对文件属性有更好的支持。

如您所知,对文件进行解压缩需要花费时间,即使存在索引,也可能是解压缩速度的一个因素。

编辑:您可能还想看看xar。它具有一个XML标头,其中包含有关存档中文件的信息。

从引用的页面:

Xar的XML标头允许它包含有关存档中包含的文件的任意元数据。除了诸如文件大小及其修改和创建时间之类的标准unix文件元数据外,xar还可以存储ext2fs和hfs文件位,unix标志,对扩展属性的引用,Mac OS X Finder信息,Mac OS等信息。 X资源分叉,以及文件数据的哈希。


+1提醒我以前从未听说过的有用的发声工具。
cas

的链接star已关闭……
Pacerier 2015年

5

ThorbjørnRavn Anderser是对的。默认情况下,GNU tar创建“可搜索”档案。但是,如果未指定-n选项,则在读取这些归档文件时不会使用该信息。使用-n选项,我只是从300GB存档中及时提取了7GB的文件来读取/写入7GB。如果没有-n,则花费了一个多小时,并且没有任何结果。

我不确定压缩如何影响这一点。我的档案未压缩。压缩档案不是“可搜索的”,因为当前(1.26)的GNU tar将压缩卸载到了外部程序中。


根据tar手册页man7.org/linux/man-pages/man1/tar.1.html,默认情况下,GNU tar会在编写时使用可搜索格式,如果归档是可搜索的,则在阅读时会使用它(对于列出或提取)。如果您使用的是GNU tar,但仍然遇到问题,则应向GNU提交错误报告。
Brian Minton 2014年

7
如果我正确阅读了该手册,它永远不会说它具有任何索引,并且可以在给定文件名的情况下跳转到存档中的任何文件。--seek只是表示基础媒体是可搜索的,因此,从头开始读取时,它可以跳过读取文件内容,但是仍然需要从头开始读取条目标头。就是说,如果您有一个包含1M个文件的归档文件,并且尝试使用--no-seek提取最后一个文件,则需要读取所有文件的内容。使用--seek,您只需要读取1M的标头,每个文件一个,但是它仍然非常慢。
icando 2015年

4

我知道的唯一存储索引的存档格式是ZIP,因为我不得不多次构造损坏的索引。


2

我不知道它没有索引,但是我对大型文件使用转储和还原,并且以交互方式浏览还原树以选择随机文件非常快。


2

如果可以访问该p7zip-full软件包,则可以使用7z(7zip)存档/压缩格式。

在Ubuntu上,您可以使用以下命令进行安装:

$ sudo apt-get install p7zip-full

要创建存档,可以使用7z a <archive_name> <file_or_directory>;如果不想压缩文件,而只是按原样“存储”,则可以使用以下-mx0选项:

$ 7z a -mx0 myarchive.7z myfile.txt

Creating archive myarchive.7z

然后,您可以使用提取文件7z e

$ 7z e myarchive.7z

Processing archive: myarchive.7z
Extracting  myfile.txt

或者,您可以使用列出归档文件的索引,该索引7z l非常适合使用进行搜索grep

$ 7z l myarchive.7z | grep

2014-07-08 12:13:39 ....A            0            0  myfile.txt

这也是t测试完整性,u向存档中添加/更新文件以及d删除文件的选项。

重要说明
待办事项使用的Linux文件系统备份的7zip的格式,因为它没有存储包含文件的所有者和组。


对于Linux,最好将zip文件压缩为7zip。
托尔比约恩Ravn的安徒生

1

我相信GNU tar能够满足您的要求,但是我无法找到确定的资源。

无论如何,您都需要带有索引的归档格式(因为这样做可以做您想做的事情)。我不相信ZIP文件会变得那么大。


ZIP文件可能会很大
Pacerier,2015年

1
如果我正确阅读了该手册,它永远不会说它具有任何索引,并且可以在给定文件名的情况下跳转到存档中的任何文件。--seek只是表示基础媒体是可搜索的,因此,从头开始读取时,它可以跳过读取文件内容,但是仍然需要从头开始读取条目标头。就是说,如果您有一个包含1M个文件的归档文件,并且尝试使用--no-seek提取最后一个文件,则需要读取所有文件的内容。使用--seek,您只需要读取1M的标头,每个文件一个,但是它仍然非常慢。
icando 2015年

2
@Pacerier以我的理解,ZIP64格式允许很大的文件,但原始的ZIP格式却不允许。
托尔比约恩Ravn的安德森

@ThorbjørnRavnAndersen,一个4 GB的文件非常
和平者

3
自从20年前DVD ISO出现以来,@ Pacerier 4GB并不大。如今,Terrabytes很大。
oligofren
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.