通过管道将多个文件 (gz) 传送到 C 程序中

发布于 2024-08-25 17:43:31 字数 390 浏览 9 评论 0 原文

我编写了一个 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

我该怎么做?

I've written a C program that works when I pipe data into my program using stdin like:

gunzip -c IN.gz|./a.out

If I want to run my program on a list of files I can do something like:

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

But this will start my program 'number of files' times.
I'm interested in piping all the files into the same process run.

Like doing

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

How can I do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

北凤男飞 2024-09-01 17:43:31

不需要 shell 循环:

gzip -cd $(<list.txt) | ./a.out

使用“-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

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

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

There is no need for a shell loop:

gzip -cd $(<list.txt) | ./a.out

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:

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

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:

{
cat /etc/passwd /etc/group
for i in `cat list.txt`
do
    gunzip -c $i
done
} |
./a.out

Or:

{
cat /etc/passwd /etc/group
for i in `cat list.txt`
do
    gunzip -c $i
done; } |
./a.out

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:

(
cat /etc/passwd /etc/group
for i in `cat list.txt`
do
    gunzip -c $i
done
) |
./a.out

Or:

( cat /etc/passwd /etc/group
  for i in `cat list.txt`
  do
      gunzip -c $i
  done) |
./a.out

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:

some_command arg1 arg2 |
{
first sub-command
second command
for i in $some_list
do
    ...something with $i...
done
} >$outfile 2>$errfile
绝影如岚 2024-09-01 17:43:31

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

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

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

或者您可以使用子 shell。

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

You should be able get one gunzip process unzip multiple files.

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

(zcat is another way of calling gunzip -c on many systems and shows the parallel with cat; but check for gzcat if your system's zcat is actually uncompress.)

Alternatively you can use a sub shell.

(
  for i in $(cat list.txt)
  do
    gunzip -c "$i"
  done
) | ./a.out
静水深流 2024-09-01 17:43:31

这是一个空壳问题。但据我所知你可以这样做:

cat file* | your_program

或者

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

This is rather a shell question. But AFAIK you can do:

cat file* | your_program

or

for i in file*; do gunzip -c $i; done | your_program
绝不放开 2024-09-01 17:43:31

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.

浅忆流年 2024-09-01 17:43:31

如果您的程序不需要知道特定输入何时结束而另一个输入何时开始,您可以这样做:

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

我希望它会对您有所帮助
问候

If your program doesn't need to know when a particular input ends and another one begins, you can do this:

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

I hope it will help you
Regards

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文