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

我怎样才能做到这一点?

有帮助吗?

解决方案

有不需要一个壳循环:

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

如果环路的内容是更复杂的(不是简单地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

其他提示

您应该能够得到一个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的文件有空格的,那么你需要通过一些额外的铁圈。

如果你的程序并不需要知道当一个特定的输入端,另一个开始,你可以这样做:

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

我希望它会帮助你 此致

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top