通过管道将多个文件 (gz) 传送到 C 程序中
我编写了一个 C 程序,当我使用标准输入将数据通过管道传输到我的程序中时,该程序可以工作:
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
我该怎么做?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
不需要 shell 循环:
使用“
-cd
”选项,gzip 会将文件列表解压缩到标准输出(或者您可以使用“gunzip -c
” ')。$( 表示法将指定文件的内容扩展为参数列表,而无需启动子进程。否则它相当于
$(cat list.txt)
。但是,如果您觉得必须使用循环,则只需将循环的输出通过管道传输到程序的单个实例中:
如果循环的内容更复杂(比简单地压缩单个文件),这可能是必要的。您还可以使用“
{ ... }
”I/O 重定向:或者:
注意分号;需要带牙套。在这个例子中,它本质上与使用带括号的正式子 shell 相同:
或者:
注意这里没有分号;不需要。外壳有时会非常狡猾。当您需要在管道符号之后对命令进行分组时,大括号 I/O 重定向会很有用:
There is no need for a shell loop:
With the '
-cd
' option, gzip will uncompress a list of files to standard output (or you can use 'gunzip -c
'). The$(<file)
notation expands the contents of the named file as a list of arguments without launching a sub-process. It is equivalent to$(cat list.txt)
otherwise.However, if you feel you must use a loop, then simply pipe the output from the loop into a single instance of your program:
If the contents of the loop are more complex (than simply gunzipping a single file), this might be necessary. You can also use '
{ ... }
' I/O redirection:Or:
Note the semi-colon; it is necessary with braces. In this example, it is essentially the same as using a formal sub-shell with parentheses:
Or:
Note the absence of a semi-colon here; it is not needed. The shell is wonderfully devious on occasion. The braces I/O redirection can be useful when you need to group commands after the pipe symbol:
您应该能够通过一个
gunzip
进程解压缩多个文件。(
zcat
是在许多系统上调用gunzip -c
的另一种方式,并显示与cat
的相似之处;但请检查gzcat 如果您的系统的
zcat
实际上是uncompress
。)或者您可以使用子 shell。
You should be able get one
gunzip
process unzip multiple files.(
zcat
is another way of callinggunzip -c
on many systems and shows the parallel withcat
; but check forgzcat
if your system'szcat
is actuallyuncompress
.)Alternatively you can use a sub shell.
这是一个空壳问题。但据我所知你可以这样做:
或者
This is rather a shell question. But AFAIK you can do:
or
xargs 是你的朋友
% cat list.txt | xargsgunzip -c | xargs ./a.out
如果 list.txt 中的文件中有空格,那么您需要进行一些额外的操作。
xargs is your friend
% cat list.txt | xargs gunzip -c | ./a.out
if the files in list.txt have spaces in them then you need to go through some extra hoops.
如果您的程序不需要知道特定输入何时结束而另一个输入何时开始,您可以这样做:
我希望它会对您有所帮助
问候
If your program doesn't need to know when a particular input ends and another one begins, you can do this:
I hope it will help you
Regards