用于在存档中存储文件的虚拟只写文件系统

krl*_*mlr 8 filesystems tar fuse parallelism

我有一个令人尴尬的并行过程,它创建了大量几乎(但不完全)相同的文件。有没有办法“即时”存档文件,以便数据不会占用不必要的空间?

进程本身接受命令行参数并将创建的每个文件的名称打印到标准输出。我正在调用它,parallel --gnu它负责分配输入(来自另一个进程)和收集输出:

arg_generating_process | parallel --gnu my_process | magic_otf_compressor
Run Code Online (Sandbox Code Playgroud)

管道第一部分的简单示例bash

for ((f = 0; $f < 100000; f++)); do touch $f; echo $f; done
Run Code Online (Sandbox Code Playgroud)

怎么可能magic_otf_compressor长得像?它应该将每个输入行视为文件名,将每个文件复制到压缩.tar存档(处理所有文件的存档相同!),然后将其删除。(实际上,打印每个处理文件的名称应该就足够了,另一个| parallel --gnu rm可以负责删除文件。)

有没有这样的工具?我不考虑单独压缩每个文件,这会浪费太多空间。我已经研究过archivemount(将文件系统保留在内存中 -> 不可能,我的文件太大太多)和avfs(无法让它与 FUSE 一起工作)。我错过了什么?

我离自己破解这样一个工具只有一步之遥,但之前肯定有人做过......

编辑:基本上我想我正在寻找一个标准输入前端libtar(而不是从命令行tar读取参数的命令行前端)。

krl*_*mlr 7

RTFM的经典案例(全部!)-TGNU的选项tar将从另一个文件中读取要存档的文件(在我的情况下/dev/stdin,您也可以使用-),甚至还有一个--remove-files选项:

alias magic_otf_compressor='tar --create -T - --remove-files -O | pixz'
Run Code Online (Sandbox Code Playgroud)

(使用并行版本xz进行压缩,但您可以改用您喜欢的压缩器)。用作:

arg_generating_process |
  parallel --gnu my_process |
  magic_otf_compressor > file.tar.xz
Run Code Online (Sandbox Code Playgroud)

编辑:正如 Ole 指出的那样,由于某种原因,tar似乎使用该-T选项读取了整个文件列表。以下测试证实了这一点:

for ((f = 0; $f < 1000; f++)); do
    touch $f; echo $f;
done | tar -c -f otf.tar -T - -v
Run Code Online (Sandbox Code Playgroud)

在一次打印所有文件之前,我的系统有 1 秒的延迟;相反,如果tar命令被替换为cat,则所有文件在创建时都会打印出来。我已经向焦油人员提交了支持请求,让我们看看。

编辑^ 2:最新tar的源代码修复了这个问题。它尚未包含在 Ubuntu 13.10 中,但可能包含在 14.04 中。


Ole*_*nge 1

它似乎tar想预先知道所有文件名。因此,它的动态性更少,而动态性更多。cpio似乎没有这个问题:

| cpio -vo 2>&1 > >(gzip > /tmp/arc.cpio.gz) | parallel rm
Run Code Online (Sandbox Code Playgroud)