合并尾巴文件的头文件部分,然后到stdout有效的方法

其实我在巨大的痛苦南丰损坏的gzip文件,可能是由于中断的FTP传输,然后重新开始。 谷歌搜索后,我发现恢复损坏.gz的文件,我试图在读取。

我现在做的是合并与损坏的文件改变最后部分的大小,有些最后一部分gzip的头文件。 然后,我测试合并后的文件作为gunzip解输入,如果它可以产生有意义的结果。 我写了一个脚本,以下是最好的我可以重定向合并到用gunzip。 什么是重定向文件内容为gzip更有效的方法? 我想你不应该创建任何文件。 ($ i是一个大小可变)

cat head > x.gz; tail -c $i tail >> x.gz; gzip -t x.gz 2>&1 1>/dev/null

--------------解决方案-------------

相同的,但没有一个临时文件:

for ((i=0; i<$TAIL_FILE_SIZE; $i++)); do
( cat head; tail -c $i tail ) | gzip -t &>/dev/null && { echo "TEST OK: $i"; break; }
done

()创建子shell。 其输出被馈送到gzip -t它会从stdin读,如果它不是一个终端。 无临时文件 - 所有的数据都在管。

你的情况,我认为tail -c应该罚款。 许多GNU工具(包括尾巴),有相当多的表现帮助优化。 例如在我的办公室SUSE, tail -c使用的mmap()来访问输入文件。

否则,读取一个文件偏移一个常使用dd

PS在Perl中,你可以阅读的头部和尾部文件到内存中,然后使用SUBSTR()尝试喂养件从CPAN一些GZIP库。 (我敢肯定有GZIP库Perl的 - 但我还没有使用的一个谷歌立即显示几命中。)这样,你会被删除的进程和文件的重读启动的开销进一步降低。

这是你的命令的修正版本:

cp head x.gz; tail -c $i tail >> x.gz; gzip -t x.gz >/dev/null 2>&1

通过重定向所有输出到/dev/null话你就GZIP的完整性测试结果的退出代码仅仅依靠因为没有信息会被打印到终端。 注意,重定向的顺序是显著。

如果你不希望创建一个中间文件:

cat head <(tail -c $i tail) | gzip -t >/dev/null 2>&1

它看起来像你的脚本前面,你创建一个名为“头”和“尾”的文件。 有可能做到这一点不同,具有更有效的操作的整体。

分类:Linux的 时间:2015-03-15 人气:2
本文关键词: Perl中,Linux的话,bash
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.447 (s). 10 q(s)