パイプ複数のファイル(GZ)Cプログラムに
質問
私はCプログラムを書いている作品のときのような標準入力を使用して私のプログラムにIパイプデータ:
gunzip -c IN.gz|./a.out
私は私のような何かを行うことができ、ファイルのリストに私のプログラムを実行する場合:
for i `cat list.txt`
do
gunzip -c $i |./a.out
done
しかし、これは私のプログラム回「ファイルの数」を開始します。 私は、同じプロセスの実行にすべてのファイルをパイプに興味があります。
を行うよう
for i `cat list.txt`
do
gunzip -c $i >>tmp
done
cat tmp |./a.out
私はこれを行うことができますどのように?
解決
シェルループの必要はありません。
gzip -cd $(<list.txt) | ./a.out
「-cd
」オプションを使用すると、gzipでは標準出力にファイルのリストを展開します(または、あなたは「gunzip -c
」を使用することができます)。 $(<file)
表記は、サブプロセスを起動せずに、引数のリストとして指定したファイルの内容を展開します。そうでない場合は$(cat list.txt)
することと等価である。
しかし、あなたはループを使用しなければならないと感じた場合には、単にパイプあなたのプログラムの単一のインスタンスへのループからの出力:
for i in `cat list.txt`
do
gunzip -c $i
done |
./a.out
ループの内容は、(単に1つのファイルをgunzippingより)もっと複雑な場合、、これが必要になる場合があります。
:あなたはまた、 '{ ... }
' I / Oリダイレクションを使用することができます
{
cat /etc/passwd /etc/group
for i in `cat list.txt`
do
gunzip -c $i
done
} |
./a.out
それともます:
{
cat /etc/passwd /etc/group
for i in `cat list.txt`
do
gunzip -c $i
done; } |
./a.out
セミコロンに注意してください。それは、中括弧では必要です。この例では、本質的に括弧付きフォーマルサブシェルを使用するのと同じである。
(
cat /etc/passwd /etc/group
for i in `cat list.txt`
do
gunzip -c $i
done
) |
./a.out
それともます:
( cat /etc/passwd /etc/group
for i in `cat list.txt`
do
gunzip -c $i
done) |
./a.out
ここでセミコロンが存在しないことに注意してください。それは必要ありません。シェルは、機会に素晴らしくよこしまです。かっこI / Oリダイレクションあなたはパイプ記号の後にグループのコマンドに必要なときに役立つことができます:
some_command arg1 arg2 |
{
first sub-command
second command
for i in $some_list
do
...something with $i...
done
} >$outfile 2>$errfile
他のヒント
あなたの複数のファイル解凍できGET 1 gunzip
プロセスである必要があります。
zcat $(cat list.txt) | ./a.out
(zcat
がgunzip -c
と並行して多くのシステムやショーにcat
を呼び出す別の方法である;しかし、あなたのシステムのgzcat
が実際にzcat
ある場合uncompress
をチェックする)
別の方法としては、サブシェルを使用することができます。
(
for i in $(cat list.txt)
do
gunzip -c "$i"
done
) | ./a.out
これはかなりシェル質問です。しかし、私の知る限りでは、あなたが行うことができます:
cat file* | your_program
または
for i in file*; do gunzip -c $i; done | your_program
xargsが
あなたの友達です%の猫list.txtに| xargsのはgunzip -c | ./a.out
list.txtにあるファイルは、それらにスペースを持っている場合は、あなたは、いくつかの余分なフープを通過する必要があります。
あなたのプログラムは、特定の入力が終了し、別の1の開始時に知っておく必要がない場合は、あなたがこれを行うことができます:
for i `cat list.txt`
do
gunzip -c $i
done |./a.out
私はそれはあなたを助けることを願っています よろしく