2013-02-14 2 views
15

मैं आदेशकैसे -exec को खोजने से बाहर निकलने के लिए अगर यह फ़ाइलों

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

चलाना चाहते हैं में से एक पर विफल रहता है, लेकिन मुझे लगता है आदेश आदेश

program \{} 
जैसे ही छोड़ना चाहते

मिली किसी भी फाइल पर विफल रहता है।

क्या ऐसा करने का कोई आसान तरीका है?

+0

संबंधित: http://unix.stackexchange.com/questions/62880/how-to-stop-the-find-command-after-first-match – kojiro

उत्तर

1

आप पाइप find से उत्पादन एक और उपप्रक्रिया को कर सकता है और उपयोग while/break:

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

यह बेहतर होगा कि अगर ऐसा होगा तो! कार्यक्रम $ एफ; तो तोड़ो ... '। आप '-print0' और read -d 'का उपयोग करके न्यूलाइन के बजाय एनयूएल में भी सीमित हो सकते हैं, जो सुरक्षित है। – kojiro

+1

यह संस्करण @kojiro से सुरक्षा सुझाव लागू करता है, जो फाइलों में रिक्त स्थान होने पर महत्वपूर्ण हैं। इसके लिए आपको '$ f' के आस-पास उद्धरणों की भी आवश्यकता है। (और ध्यान दें कि यह बैश-विशिष्ट '$ ''' का उपयोग करता है)। यह भी छोटा है: 'पथ -प्रिंट 0 खोजें जबकि पढ़ा-$ $ \ 0 'एफ; आदेश "$ एफ" || करें टूटना; किया गया ' – darque

2

मुझे लगता है कि इसे प्राप्त करने के आप क्या चाहते हैं, केवल find -exec साथ संभव नहीं है।

निकटतम विकल्प, xargs को पाइप find करने के लिए इस तरह होगा:

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

अन्य ललित जवाब के अलावा, जीएनयू लगता है (कम से कम) एक -quit विधेय है:

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

-quit विधेय certainly non-standard है और बीएसडी खोजने में मौजूद नहीं है।

(जरूरत के लिए: (Kojiro के जवाब है, जो मेरे लिए exaclty काम नहीं किया था के आधार पर)

+2

यह मेरी आवश्यकता के करीब है, लेकिन अगर यह विफल रहता है (भविष्यवाणी का दूसरा भाग) तो मुझे एक गैर-बाहर निकलने की स्थिति से बाहर निकलने की आवश्यकता है। – Lucas

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

यहाँ एक "का निर्माण प्रणाली" है, जो पहले संकलक त्रुटि से टकराने के बाद बंद हो जाता है के लिए मेरे उदाहरण है बच निकले कोष्ठक असली है। मुझे पता है कि दर्द होता है।)

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

मैं मूल रूप से सभी सी ++ वर्तमान निर्देशिका और नीचे में स्थित फ़ाइलों की एक स्थिर पुस्तकालय का निर्माण करना चाहते हैं।

संकलक मैं फ़ाइल -print एड करना चाहते हैं, तो -exec एड चल रहा है, लेकिन जब यह विफल रहता है (और stderr पर त्रुटियों को छोड़ देता है, यह -quit चाहिए पहले।

-a&& की तरह है और -o की तरह है खोल या सी

कोष्ठकों के बिना में ||, जीएनयू लगता है "का अनुकूलन" क्वेरी, पहले सबसे संभावित हालत की कोशिश कर रहा है, जिसके माध्यम से - मुझे लगता है कि -। -quit

संबंधित मुद्दे