2013-02-14 16 views
15

我要運行的命令如何從發現-exec退出,如果失敗就

find some/path -exec program \{} \; 

的一個文件,但我想find命令的命令

program \{} 
儘快退出

在找到的任何文件上失敗。

有沒有簡單的方法來做到這一點?

+0

相關:http://unix.stackexchange.com/questions/62880/how-to-stop-the-find-command-after-first-match – kojiro 2013-02-14 12:25:10

回答

1

,你可以管,從find輸出到另一個子流程和使用while/break

find some/path | while read f 
do 
    program $f 
    if [ $? -ne 0 ] 
    then 
     break 
    fi 
done 
+1

只要做'如果!程序$ f;然後打破......。你也可以使用'-print0'分隔NUL而不是換行符,並讀取-d'',這更安全。 – kojiro 2013-02-14 12:28:08

+1

這個變體應用來自@kojiro的安全建議,如果文件包含空格,這很重要。爲此你還需要引用'$ f'。 (並注意它使用特定於bash的'$''')。它也更小:'find path -print0 |同時讀-d $'\ 0'f;做命令「$ f」||打破;完成' – darque 2013-02-15 02:02:48

2

我認爲這是不可能實現你想要什麼,只能用find -exec

最接近的替代辦法是做管findxargs,像這樣:

find some/path -print0 | xargs -0 program 

find some/path -print0 | xargs -0L1 program 

如果程序有一個非零退出狀態終止這將退出

  • print0用於使文件中帶有換行符名稱可以處理
  • -0-print0使用的
  • L1告訴xargs程序用一個參數來執行程序一次(默認是添加的所有參數在程序的一次執行)
是必要的

如果你只有理智的文件名,可以簡化這樣的:

find some/path | xargs program 

find some/path | xargs -L1 program 

最後,如果程序需要多個參數,則可以使用-i{}結合使用。例如。

find some/path | xargs -i program param1 param2 {} param4 
4

除了其他精細答案,GNU找到(至少)有-quit斷言:

find path -other -predicates \(-exec cmd {} \; -o -quit \) 

-quit謂詞是certainly non-standard和BSD發現不存在。

+2

這與我所需要的很接近,但如果失敗(謂詞的第二部分),我需要以非零退出狀態退出。 – Lucas 2016-10-14 18:21:47

0
% _find_trap() { 
> _find_pid="${1}" ; _find_ops="${2}" ; _find_trigger="${3}" 
> shift 3 && set -- "${@}" 
> trap 'kill -s INT "-${_find_pid}" \ 
>  unset _find_pid _find_ops _find_trigger ; set - \ 
>  1>&2 printf "%s" "find killed due to trap" \ 
>  exit [CODE] ' TRAP 
> while { sh -c "${_find_ops} ${@}"} { 
> [ "${_find_trigger}" ] && { kill -s TRAP "-${_find_pid}" ; break ; } 
> ... 
> } 
> export -f _find_trap ; find . -execdir _find_trap \"$$\" \"${cmds}\" \ 
> \"${testable_trigger}\" "{}" + 
0

這裏是我的一個「構建系統」,擊中第一個編譯器錯誤 後停止的例子(基於小次郎的回答,這沒有exaclty工作對我來說):

(需轉義括號是真實的,我知道這很傷人。)

find -name '*.cpp' \(-print -a -exec g++ -c {} \; -o -quit \) 

我想建立一個基本上位於當前目錄和下面的所有C++文件的靜態庫。

運行我想有文件-print -ed編譯器,然後-exec -ed,但是當它失敗(和葉stderr的錯誤,它應該-quit之前。

-a就像&&-o||在外殼或C.

如果沒有括號,GNU找到「優化」的查詢,通過首先嚐試最可能的情況下,這是 - 我猜 - -quit

相關問題