我发现linux gnu tar有问题。我使用选项
-T - (for file list from stdin) or
-T named_pipe_file ,
这并非即时进行。例如,简单的交互式脚本:
while read x; do echo $x; done|\
tar cvf tar.tar -T -
tar仅在按^ D标记输入EOF时才开始归档,与使用命名管道时的情况相同:
mkfifo named_pipe
tar cvf tar.tar -T named_pipe
while read x; do echo $x; done >named_pipe
似乎tar可以缓冲。但是要多久?我必须将很多文件重新打包到TAR,但磁盘空间很小。然后,我必须即时执行此操作。我为此使用tar选项--remove-files。但是,如果没有与-T选项的交互性,那是不可能的。在计划中,代码的“ while”部分应随后将文件解压缩到文件中,并等待TAR删除以及下一个文件。谢谢你的主意:)
我的tar版本:tar(GNU tar)1.26(C)2011 FSF
tar
能够追加到已经存在的档案中,因此您可以执行以下操作:
touch tarfile.tar
command_that_produces_file_list | xargs tar rf tarfile.tar
不幸的是,这不适用于即时压缩。幸运的是,这种tar
格式非常简单,我们可以进行一些黑客攻击:
command_that_produces_file_list | {
xargs -i sh -c 'tar c {} | head -c $(( (`stat --printf="%s" {}` + 511) / 512 * 512 + 512))';
dd if=/dev/zero bs=512 count=2 2>/dev/null;
} | compression_utility
tar
对于每个文件,输出包含一个512字节的标头,后跟足够的512字节的块来保存文件数据。然后,它附加至少2个512字节的零块。该代码的作用是捕获tar的输出并删除多余的零块,将来自多次调用的输出组合tar
在一起,然后粘贴在终止的零块上。输出通过管道发送到压缩实用程序,该实用程序与tar
s同时运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句