题
我已经写了一个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
我希望它会帮助你 此致
不隶属于 StackOverflow