当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 将已排序的文件与fifos组合在一起

来源:互联网 收集:自由互联 发布时间:2021-06-22
我在目录中有一些已排序,压缩的文件.如何将其中一些组合成另一个已排序的gzip文件?现在我正在使用显式的fifos.有没有办法在没有bash的情况下做到这一点?我是一个bash noob,所以请原
我在目录中有一些已排序,压缩的文件.如何将其中一些组合成另一个已排序的gzip文件?现在我正在使用显式的fifos.有没有办法在没有bash的情况下做到这一点?我是一个bash noob,所以请原谅我缺乏风格.

#!/bin/bash
# Invocation ./merge [files ... ]
# Turns an arbitrary set of sorted, gzipped files into a single sorted, gzipped file,
# printed to stdout. Redirect this script's output!
for f in $@
do
    mkfifo $f.raw
    gzcat $f > $f.raw &
    # sort -C $f.raw
done
sort -mu *.raw | gzip -c # prints to stdout.
rm -f *.raw

我想把它转换成像……

sort -mu <(gzcat $1) <(gzcat $2) <(gzcat $3) ... | gzip -9c # prints to stdout.

……但不知道怎么做.我是否需要将参数构建为字符串?这有什么神奇的捷径吗?也许map gzcat $@?

注意:每个文件超过10GB(解压缩100GB).我有一个2TB驱动器,所以这不是一个真正的问题.此外,该程序必须在O(n)中运行,否则变得不可行.

您可以将eval和’进程替换’与Bash结合使用.假设基本文件名不包含空格(假设您使用$@代替“$@”可能就是这种情况),那么类似于:

cmd="sort -mu"
for file in "$@"
do cmd="$cmd <(gzip -cd $file)"
done
eval $cmd | gzip -c9 > outputfile.gz

您也可以在最后一行使用bash -c“$cmd”而不是eval $cmd.如果文件名中有空格,则必须更加努力.如果名称不包含单引号,则此方法有效:

cmd="sort -mu"
for file in "$@"
do cmd="$cmd <(gzip -cd '$file')"
done
eval $cmd | gzip -c9 > outputfile.gz

在文件名中也使用单引号,您必须更加努力地工作.

网友评论