5

ディレクトリに、並べ替えられた gzip ファイルがいくつかあります。それらのいくつかを別のソートされたgzipファイルに結合するにはどうすればよいですか? 現在、明示的な fifo を使用しています。なしでbashでそれを行う方法はありますか? 私は少しバッシュ初心者なので、私のスタイルの欠如を許してください.

#!/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 $@

注: 各ファイルは 10 GB を超えています (解凍すると 100 GB になります)。私は2TBのドライブを持っているので、これは実際には問題ではありません. また、このプログラムは O(n) で実行する必要があります。そうしないと実行できなくなります。

4

3 に答える 3

3

Bashと組み合わせevalて「置換を処理」できます。基本的なファイル名にスペースが含まれていないと仮定すると (これは、$@代わりに使用することを考えると、"$@"おそらくそうです)、次のようになります。

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

ファイル名にも一重引用符が含まれているため、より多くの作業を行う必要があります。

于 2011-06-13T05:26:30.340 に答える
1

ファイル名にも一重引用符が含まれているため、より多くの作業を行う必要があります。

以下は、ファイル名 (またはファイル パス) 内の単一引用符をエスケープする方法で、単一引用符でeval囲まれた変数で 'ed になります。

(
esc="'\''"
file="/Applications/iWork '09/Pages.app"
file="${file//\'/${esc}}"
#echo "'${file}'"; ls -bdl "'${file}'"
evalstr="echo '${file}'; ls -bdl '${file}'"
#set -xv
eval "${evalstr}"
)
于 2011-06-14T14:42:10.820 に答える
1

私にとって、あなたの質問は少し不明確ですが、あなたの必要性を理解したら、これを試してください:

gunzip -c file1 file2 .... | sort | gzip -9 > mergedFile.gz

特定のタイプのすべてのファイルを 1 つのディレクトリにまとめたいfile*.type場合は、gunzip への入力リストとして使用できます。それ以外の場合、私の例では、各ファイルを明示的にリストする必要があります。

この-cオプションは、「出力を stdout に送信」を示します。これは、パイプによって読み取られ、に送信されsort、その出力がパイプである stdout に送信され、gzip に送信されます。stdout は最終ファイルにリダイレクトされます。これ-9は最も圧縮率が高く、(gzip の場合) 最小のファイルが得られますが、時間がかかります。-1 から -9 までの明示的な数値を指定して、必要に応じて圧縮サイズ/圧縮時間のトレードオフを調整できます。

これが役立つことを願っています。

于 2011-06-13T04:42:58.500 に答える