2013-03-09 67 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