मैं पाया निर्देशिका में उतरने से एक खोज को कैसे रोकूं?


24

मैं सभी निर्देशिकाओं को एक विशिष्ट स्ट्रिंग के साथ ढूंढना चाहता हूं ताकि मैं भीतर मौजूद फाइलों पर एक और खोज कर सकूं।

इसलिए मैं समय बर्बाद नहीं करना चाहता ./my-search-term/dir/my-search-termआदि।

जब मैंने पहली बार खोज-खोज निर्देशिका प्राप्त की है, तो मैं कैसे पीछे हटना बंद कर सकता हूँ?


3
क्या आपने -प्र्यून के साथ खोजने की कोशिश की है? मैन पेज से: "यदि फ़ाइल एक निर्देशिका है, तो उसमें न उतरें। यदि -depth दिया गया है, तो गलत; कोई प्रभाव नहीं।-क्योंकि तात्पर्य -depth है, तो आप उपयोगी -प्रयोग और -delete एक साथ उपयोग नहीं कर सकते हैं।"
22

1
@laebshade आप एक उत्तर में क्यों नहीं डालते?
jw013

@ jw013 मेरे पास उस समय और अधिक जवाब देने के लिए समय नहीं था।
laebshade

जवाबों:


17

-pruneकार्रवाई बनाता findनिर्देशिका में recurse नहीं। आप इसे दूसरी कार्रवाई के साथ जोड़ सकते हैं जैसे -exec(के आदेश -pruneऔर -execइससे कोई फर्क नहीं पड़ता, जब तक कि -pruneकिसी भी तरह से निष्पादित नहीं किया जाता है)।

find . -name my-search-term -prune -exec find {} … \;

ध्यान दें कि findअंदर घोंसला बनाना find -execथोड़ा समस्याग्रस्त हो सकता है: आप -execआंतरिक में उपयोग नहीं कर सकते find, क्योंकि टर्मिनेटर को बाहरी द्वारा एक टर्मिनेटर के रूप में देखा जाएगा find। आप शेल खोलकर उसके चारों ओर काम कर सकते हैं, लेकिन उद्धृत करने से सावधान रहें।

find . -name my-search-term -prune -exec sh -c '
    find "$@" … -exec … {\} +
' _ {} +

क्या आपके पहले आदेश में कोष्ठक आवश्यक हैं? -pruneरिटर्न सच और पहले रखा जा सकता है -exec
rozcietrzewiacz

@rozcietrzewiacz नहीं, वे आवश्यक नहीं हैं। -oवहाँ होने की आदत , मुझे लगता है। और मुझे लगता है कि -pruneइससे पहले कि -execयह अधिक पठनीय हो।
गिल्स एसओ- बुराई को रोकें

धन्यवाद, -pruneपहले विकल्प का उपयोग नहीं किया ।
haridsv

मेरे उपयोग के मामले में, यह कमांड: mkdir -p x1 x2; touch x1/x11 x1/x12 x2/x21 x2/x22; find . -name 'x1*' -exec rm -rf {} \;त्रुटि देता है find: ./x1: No such file or directory:। समाधान कमांड -pruneके अंत में जोड़ना है find
haridsv

(१) किसी तर्क के विकल्प के रूप में प्रकट होने पर भी findविस्तार के कुछ संस्करण । आपके दूसरे कमांड पर इस तरह का संस्करण चोक होगा, क्योंकि इनर कमांड (शेल कमांड में) को बाहरी में मिली डायरेक्टरी के नाम से बदल दिया जाएगा । आप इसे कहकर ठीक कर सकते हैं  अर्थात , जिसका उपयोग करके शेल चालू हो जाएगा । … (Cont'd){}-execfind{}findfindfind . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \;"{"}{}
स्कॉट

6

- नंगे समाधान -

यदि आप findमिली निर्देशिका की सामग्री को छोड़ना चाहते हैं, लेकिन अन्य निर्देशिकाओं में खोज जारी रखें, -pruneजैसा कि @laebshade ने सुझाव दिया है। पूरी कमांड तब दिखनी चाहिए

 find . -type d -name somename -prune -exec ...

दूसरी ओर, यदि आप findपूरी तरह से खोज को रोकना चाहते हैं और पहली मिलान निर्देशिका को खोजने के बाद, तो आप जो खोज रहे हैं वह -quitउपलब्ध है (संस्करण 4.2.3के बाद से उपलब्ध है GNU find)। यह उपयोग करने के लिए थोड़ा अधिक मुश्किल है, क्योंकि यह findतुरंत बाहर निकलता है - इसलिए -quitइसे कमांड के बहुत अंत में रखा जाना चाहिए:

find . -type d -name somename -exec ... -quit

उम्मीद के मुताबिक काम करने के लिए, किसी को यह आश्वासन देना होगा कि -execरिटर्न सही है (दूसरे शब्दों में, एक शून्य स्थिति)। यदि आप चाहते हैं कि बाहर निकलने की स्थिति -execको नजरअंदाज कर दिया जाए, ताकि -quitहमेशा काम करें, तो आपको थोड़ी चाल की जरूरत है:

find . -type d -name somename \( -exec ... -o -true \) -quit

या

find . -type d -name somename \( -exec ... -o -quit \)

या

find . -type d -name somename \( -exec ... , -quit \) # a comma before -quit

- कुछ स्पष्टीकरण -

कैसे findकाम करता है के बारे में सबसे महत्वपूर्ण बात यह है कि सभी क्रियाओं ("परीक्षण") को तार्किक भविष्यवाणी के रूप में माना जाता है जो बाएं से दाएं व्याख्या की जाती हैं। इसलिए, अंतिम क्रिया (उदाहरण के लिए -quit) केवल तब ही की जाएगी जब पूरा पिछला हिस्सा झूठा नहीं लौटा । डिफ़ॉल्ट रूप से, सभी परीक्षण तार्किक "और" के साथ जुड़ जाते हैं, -oविकल्प संयुक्त को "OR" में बदल देता है।

इसका एक मुश्किल तत्व -oयह है कि findआपकी कमांड को "ऑप्टिमाइज़" किया जा सकता है और -execयदि आप सिर्फ टाइप करते हैं तो भाग नहीं चला सकते हैं

find . -type d -name somename -exec ... -o -quit

इसका सामना करने के लिए, आप findकोष्ठकों के भीतर संलग्न करके "या" के साथ joned सभी विधेय का मूल्यांकन करने के लिए मजबूर कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.