从tar.gz中提取文件,而不触及磁盘

时间:2012-06-18 23:54:50

标签: bash tar

当前流程:

  1. 我有tar.gz个文件。 (实际上,我有大约2000个,但这是另一个故事)。
  2. 我创建一个临时目录,提取tar.gz文件,显示100,000个小文件(每个大约600个字节)。
  3. 对于每个文件,我将其捕获到一个处理程序中,将其循环到另一个分析程序中,然后保存结果。
  4. 我正在使用的机器上的临时空间几乎不能同时处理其中一个进程,更不用说它们默认发送的16(超线程双四核)。 我正在寻找一种方法来执行此过程而不保存到磁盘。我认为使用tar -xf $file -O <targetname>单独提取文件会降低性能,但这可能是我所困扰的。

    有没有办法做到这一点?

    编辑:由于两个人已经犯了这个错误,我将澄清:

    • 每个文件代表一个时间点。
    • 每个文件都单独处理。
    • 一旦处理(在这种情况下是傅立叶分析的变体),每个都给出一行输出。
    • 可以将此输出组合起来,以实现跨时间自相关等功能。

    EDIT2:实际代码:

    for f in posns/*; do
        ~/data_analysis/intermediate_scattering_function < "$f"
    done | ~/data_analysis/complex_autocorrelation.awk limit=1000 > inter_autocorr.txt
    

5 个答案:

答案 0 :(得分:5)

如果你不关心文件之间的界限,那么tar --to-stdout -xf $file会做你想要的;它会将存档中每个文件的内容一个接一个地发送到stdout。

这假设您正在使用GNU tar,如果您使用bash,则很有可能。

[更新]

鉴于您确实希望单独处理每个文件的约束,我同意Charles Duffy的说法,shell脚本是错误的工具。

您可以尝试他的Python建议,或者您可以尝试Archive::Tar Perl module。这些中的任何一个都允许您遍历内存中tar文件的内容。

答案 1 :(得分:4)

这听起来像是工作的正确工具可能不是shell脚本的情况。 Python有一个tarfile模块,可以在流模式下运行,只允许一次通过大型存档并处理其文件,同时仍然可以区分单个文件(tar --to-stdout方法不会)。

答案 2 :(得分:4)

您可以使用tar选项--to-command=cmd为每个文件执行命令。 Tar将文件内容重定向到命令的标准输入,并使用有关文件的详细信息设置一些环境变量,例如TAR_FILENAME。 Tar Documentation中的更多详细信息。

e.g。

tar zxf file.tar.gz --to-command='./process.sh'

请注意,OSX默认使用bsdtar,但没有此选项。您可以明确地调用gnutar

答案 3 :(得分:2)

您可以使用ramdisk(http://www.vanemery.com/Linux/Ramdisk/ramdisk.html)来处理和加载它。 (我大胆地假设您使用Linux但其他UNIX系统应该具有相同类型的规定)

答案 4 :(得分:0)

tar zxvf <file.tar.gz> <path_to_extract> --to-command=cat

以上命令仅显示shell上提取文件的内容。磁盘没有变化。 tar命令应该是GNU tar。

示例日志:

$ cat file_a
aaaa
$ cat file_b
bbbb
$ cat file_c
cccc
$ tar zcvf file.tar.gz file_a file_b file_c
file_a
file_b
file_c
$ cd temp
$ ls <== no files in directory
$ tar zxvf ../file.tar.gz file_b --to-command=cat
file_b
bbbb
$ tar zxvf ../file.tar.gz file_a --to-command=cat
file_a
aaaa
$ ls  <== Even after tar extract - no files in directory. So, no changes to disk
$ tar --version
tar (GNU tar) 1.25
...
$