2013-03-09 68 views
0

我正在测试使用通配符进行重定向。例如:Bash - 使用通配符重定向

./TEST* < ./INPUT* > OUTPUT 

任何人有任何建议吗?谢谢。

+1

什么是你想实现什么?你想迭代一个匹配模式的文件吗?选择一个与该模式相匹配的文件? – bmargulies 2013-03-09 20:39:19

+0

有一个称为TEST *的程序必须将各种重定向转换为称为INPUT *,但是有很多测试程序,它们都有不同的数字,例如, TEST678。我想要做的是将所有随机输入文件推入所有测试程序。 – Morki 2013-03-09 20:50:59

回答

1

有一个项目叫做TEST *有获得各种重定向到成称为输入*,但事情是有很多的测试程序,他们都有不同的号码,例如TEST678。我想要做的是将所有随机输入文件推入所有测试程序。

你可以写:

for program in TEST*   # e.g., program == 'TEST678' 
do 
    suffix="${program#TEST}"  # e.g., suffix == '678' 
    input="INPUT$suffix"   # e.g., input == 'INPUT678' 
    "./$program" < "$input"  # e.g., run './TEST678 < INPUT678' 
done > OUTPUT 
+0

+1如果程序和输入文件需要像这样一对一匹配。 – chepner 2013-03-09 21:06:26

+0

正是我在寻找这个很棒!谢谢 – Morki 2013-03-09 21:43:13

+0

@Morki:不客气! – ruakh 2013-03-09 21:50:08

2

假设您有以下5个文件:TEST1TEST1,INPUT1,INPUT2OUTPUT。命令行

./TEST* < ./INPUT* > OUTPUT 

将扩大到

./TEST1 ./TEST2 < ./INPUT1 ./INPUT2 > OUTPUT. 

换句话说,将运行./TEST1以2个参数(./TEST2./INPUT2),其输入从./INPUT1重定向并且其输出重定向到命令OUTPUT

要解决您可能要做的事,您只能使用输入重定向指定单个文件。为了从两个INPUT*文件的输入发送到TEST,你需要使用类似以下,使用进程替换:

./TEST1 < <(cat ./INPUT*) > OUTPUT 

运行每个上所有输入文件相匹配TEST*节目匹配INPUT*,请使用以下循环。它收集所有命令的输出并将它们放入一个文件OUTPUT

for test in ./TEST*; do 
    cat ./INPUT* | $test 
done > OUTPUT 
+0

哇,现在有更多的意义。你如何在通用测试中添加通配符?你会(猫/测试版)吗? – Morki 2013-03-09 20:53:54

0
for test in ./TEST*; do 
for inp in ./INPUT*; do 
    $test < $inp >> OUTPUT 
done 
done 
+0

图片'$ test'是'sort';这会产生与“cat ./INPUT* |”不同的结果sort'。 – chepner 2013-03-09 20:59:20