我在目录中有一些已排序,压缩的文件.如何将其中一些组合成另一个已排序的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
在文件名中也使用单引号,您必须更加努力地工作.