2012-07-05 35 views
1

我已經在C++中編寫了一個可執行文件,用於從文件中獲取輸入,並輸出到標準輸出(我希望重定向到單個文件)。問題是,我想在一個文件夾中的所有文件上運行它,並且我正在使用的find命令不合作。我正在使用的命令是:在bash中重複輸入重定向到C++可執行文件

find -name files/* -exec ./stagger < {} \; 

從查看示例,我的理解是{}替換文件名。不過,我得到的錯誤:

-bash: {}: No such file or directory 

我假設,一旦這樣冰釋前嫌,爲了得到所有結果到一個文件,我可以簡單地使用模式命令>> outputfile.txt。

謝謝你的幫助,讓我知道如果問題可以澄清。

回答

4

您遇到的問題是在查找命令之前處理重定向。您可以解決此通過在-exec呼叫產卵另一個bash進程:

find files/* -exec bash -c '/path/to/stagger < "$1"' -- {} \; 
+0

這個效果很好。非常感謝你! – 2012-07-05 20:55:46

0

只需逃脫小於號,所以重定向由find命令,而不是它在運行的shell執行:

find files/* -exec ./stagger \< {} \; 
+0

出於某種原因,我收到此錯誤的非法選項錯誤。「發現:非法選項-n 找到:非法選項-a 找到:非法選項-m 找到:非法選項-e 」 – 2012-07-05 20:56:41

+0

「-name」選項在此上下文中無效,所以我已將其刪除。 – 2012-07-05 21:12:10

+0

這將不起作用,這只是將兩個參數傳遞給'。/ stagger'程序,即文字'<和文件名。爲了使文件重定向起作用,shell必須執行它(如果程序本身無法執行),shell必須在'find'命令運行之後執行它,而不是之前。約旦的答案正確地做到了這一點。 – 2012-07-05 21:19:38

2
  1. <操作者在運行命令之前解釋爲由外殼重定向。 shell嘗試將輸入從名爲{}的文件重定向到find的stdin,並且如果該文件不存在,則會發生錯誤。

  2. -name的參數未加引號且包含glob字符。該shell應用路徑名擴展並給出查找的無意義參數。

  3. 文件名不能包含斜槓。即使被引用,-name也不能工作。如果GNU查找可用,則-path可用於指定glob模式files/*,但這並不意味着「目錄中的文件名爲files」,因此您需要-regex。便攜式解決方案更難。

  4. 您需要指定一個或多個從find開始的路徑。

假設你真正想要的是讓shell執行重定向,下面是GNU find的一種方法。

find . -type f -regex '.*foo/[^/]*$' -exec sh -c 'for x; do ./stagger <"$x"; done' -- {} + 

這可能是使用find-depth-prune不會爲這方面的工作)的最佳移植的方法:

find . -type d -name files -exec sh -c 'for x; do for y in "$x"/*; do [ -f "$y" ] && ./stagger <"$y"; done; done' -- {} + 

如果你正在使用bash,這個問題是一個很好的候選只是使用globstar而不是find

#!/usr/bin/env bash 
shopt -s extglob globstar nullglob 

for x in **/files/*; do 
    [[ -f "$x" ]] && ./stagger <"$x" 
done 
+0

+1的解釋,但我很確定他想要的是我在我的答案中猜到的。遞歸地在相對路徑文件/中的所有文件和目錄。 – jordanm 2012-07-06 14:36:50

+0

@jordanm是的,聽起來可能是這樣。不知道打開一個目錄是否有用。 – ormaaj 2012-07-06 14:57:08