質問

私は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

zcatgunzip -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

私はそれはあなたを助けることを願っています よろしく

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top