将多个文件(gz)传送到C程序中

我编写了一个C程序,当我使用stdin将数据传输到我的程序时,它可以工作:

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 

我怎样才能做到这一点?

不需要shell循环:

 gzip -cd $( 

使用' -cd '选项,gzip会将文件列表解压缩到标准输出(或者你可以使用' gunzip -c ')。 $(表示法将命名文件的内容扩展为参数列表,而不启动子进程。 它等同于$(cat list.txt)

但是,如果您觉得必须使用循环,那么只需将循环中的输出传递到程序的单个实例中:

 for i in `cat list.txt` do gunzip -c $i done | ./a.out 

如果循环的内容更复杂(而不是简单地解压缩单个文件),这可能是必要的。 您还可以使用“ { ... } ”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 

注意分号; 这是必要的括号。 在此示例中,它与使用带括号的正式子shell基本相同:

 ( 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 

注意这里没有分号; 它不是必需的。 shell有时非常狡猾。 当您需要在管道符号后对命令进行分组时,大括号I / O重定向非常有用:

 some_command arg1 arg2 | { first sub-command second command for i in $some_list do ...something with $i... done } >$outfile 2>$errfile 

您应该可以通过一个gunzip进程解压缩多个文件。

 zcat $(cat list.txt) | ./a.out 

zcat是在许多系统上调用gunzip -c另一种方式,并显示与cat的并行;但如果系统的zcat实际上是uncompress请检查gzcat 。)

或者,您可以使用子shell。

 ( for i in $(cat list.txt) do gunzip -c "$i" done ) | ./a.out 

这是一个shell问题。 但你可以做AFAIK:

 cat file* | your_program 

要么

 for i in file*; do gunzip -c $i; done | your_program 

xargs是你的朋友

%cat list.txt | xargs gunzip -c | ./a.out

如果list.txt中的文件中有空格,那么你需要经历一些额外的箍。

如果您的程序不需要知道特定输入何时结束而另一个输入何时开始,则可以执行以下操作:

 for i `cat list.txt` do gunzip -c $i done |./a.out 

我希望它会对你有所帮助