我要運行的命令如何從發現-exec退出,如果失敗就
find some/path -exec program \{} \;
的一個文件,但我想find命令的命令
program \{}
儘快退出
在找到的任何文件上失敗。
有沒有簡單的方法來做到這一點?
我要運行的命令如何從發現-exec退出,如果失敗就
find some/path -exec program \{} \;
的一個文件,但我想find命令的命令
program \{}
儘快退出
在找到的任何文件上失敗。
有沒有簡單的方法來做到這一點?
,你可以管,從find
輸出到另一個子流程和使用while
/break
:
find some/path | while read f
do
program $f
if [ $? -ne 0 ]
then
break
fi
done
我認爲這是不可能實現你想要什麼,只能用find -exec
。
最接近的替代辦法是做管find
到xargs
,像這樣:
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
除了其他精細答案,GNU找到(至少)有-quit
斷言:
find path -other -predicates \(-exec cmd {} \; -o -quit \)
的-quit
謂詞是certainly non-standard和BSD發現不存在。
這與我所需要的很接近,但如果失敗(謂詞的第二部分),我需要以非零退出狀態退出。 – Lucas 2016-10-14 18:21:47
% _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}\" "{}" +
這裏是我的一個「構建系統」,擊中第一個編譯器錯誤 後停止的例子(基於小次郎的回答,這沒有exaclty工作對我來說):
(需轉義括號是真實的,我知道這很傷人。)
find -name '*.cpp' \(-print -a -exec g++ -c {} \; -o -quit \)
我想建立一個基本上位於當前目錄和下面的所有C++文件的靜態庫。
運行我想有文件-print
-ed編譯器,然後-exec
-ed,但是當它失敗(和葉stderr
的錯誤,它應該-quit
之前。
-a
就像&&
和-o
像||
在外殼或C.
如果沒有括號,GNU找到「優化」的查詢,通過首先嚐試最可能的情況下,這是 - 我猜 - -quit
相關:http://unix.stackexchange.com/questions/62880/how-to-stop-the-find-command-after-first-match – kojiro 2013-02-14 12:25:10