पाया फ़ाइल की निर्देशिका में कमांड निष्पादित करने के लिए `find -exec` का उपयोग कैसे करें (वर्तमान निर्देशिका नहीं)?


15

चलो कहते हैं कि मैं एक निर्देशिका है जो किसी उपनिर्देशिका है, में हूँ dir1, dir2और dir3। इन निर्देशिकाओं में से प्रत्येक में एक फ़ाइल है fooऔर मैं प्रत्येक fooनिर्देशिका में प्रत्येक पर एक ही कमांड निष्पादित करना चाहता हूं और उस निर्देशिका के अंदर से उस कमांड को निष्पादित किया गया है।

अगर मैं इसे "हाथ से" करता, तो यह कुछ इस तरह दिखता:

cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)

यह आवश्यक है कि कमांड को प्रत्येक निर्देशिका से निष्पादित किया जाए । fooएक बैच शेड्यूलिंग स्क्रिप्ट है (HTCondor के लिए, यदि आप जानते हैं कि देखभाल करते हैं) और प्रत्येक उपनिर्देशिका से निष्पादित की जानी चाहिए ताकि शेड्यूलिंग स्क्रिप्ट द्वारा शुरू किए गए रनों का आउटपुट प्रत्येक उपनिर्देशिका में समाप्त हो जाए।

प्रश्न " एक फ़ाइल ढूंढें और फ़ाइल की निर्देशिका में एक कमांड निष्पादित करें ", जहां तक ​​मैं बता सकता हूं, मेरे प्रश्न का उत्तर नहीं देता है। उस प्रश्न का पहला उत्तर एक वर्कअराउंड अधिक है जो मेरे मामले में काम नहीं करेगा, और दूसरे उत्तर में मेरे लिए यह जानने के लिए पर्याप्त स्पष्टीकरण नहीं है कि इसका उपयोग कैसे किया जाए।


@roaima, कृपया बताएं कि यह कैसे एक डुप्लिकेट है। उस प्रश्न का पहला उत्तर मेरी मदद नहीं करता है, यह एक काम के आसपास अधिक है, और दूसरे उत्तर से मुझे कोई मतलब नहीं है। इसका उपयोग कैसे किया जाए, यह जानने के लिए मुझे और स्पष्टीकरण की आवश्यकता है।
न्यूट्रॉनस्टार

जवाबों:


23

अपने findसमर्थन को मानते हुए , -execdirइसके बजाय विकल्प का उपयोग करें-exec

find * -name 'foo' -execdir pwd \;

यदि ऐसा नहीं होता है, तो कृपया अपने मंच और / या वितरण (उपयुक्त के रूप में) का विवरण प्रदान करें।


जब आप "ढूंढना शुरू करते हैं:" सापेक्ष पथ './node_modules/.bin' को PATH पर्यावरण चर में शामिल किया जाता है, ": askubuntu.com/questions/621132/…
Ciro Santilli 冠状 find find find 法轮功

क्षमा करें, अगर मैं इसे ऐसा लिख ​​सकता हूं, लेकिन -execdir (उबंटू पर) बकवास है, क्योंकि यह आपको नहीं देता है {}, लेकिन इसका जनक है {}
UAV

1
@ अपने प्रयोग के मामले को जाने बिना मैं आपकी मदद नहीं कर सकता। लेकिन आपके कोड़े के जवाब में दस्तावेज़ में स्पष्ट रूप से कहा गया है " जैसे -exec, लेकिन निर्दिष्ट कमांड उपनिर्देशिका से मेल खाते फ़ाइल से चलाया जाता है "।
रोइमा

हां, ठीक है, यह एक विशेष मामला है यदि आप -type d (= निर्देशिका) की तलाश कर रहे हैं और फिर यह उप-इष्टतम है।
उवा

आपके उपयोग के मामले को जाने बिना मैं आपकी मदद नहीं कर सकता।
रोज़ा

4

यह मानते हुए कि आपकी कमांड को चलाने के लिए आपको कौन सी डायरेक्टरी पसंद है

for dir in dir1 dir2 dir3; do
    ( cd "$dir" && somecommand foo )
done

या, fooफ़ाइलों पर लूपिंग ,

for foo in */foo; do
  ( cd "${foo%/*}" && somecommand foo )
done

उपकथा cdबाकी स्क्रिप्ट की कार्यशील निर्देशिका को प्रभावित करने से रोकती है । ${foo%/*}निर्देशिका है जहाँ के नाम करने के लिए पैरामीटर प्रतिस्थापन फैलता fooफ़ाइल रहता है (पिछले के बाद सब कुछ को हटाने के द्वारा /के मूल्य में $foo)।

मानक का उपयोग findकरने के लिए एक ही काम करते हैं (उस स्थिति में जहां fooफाइलें एक निर्देशिका संरचना में गहराई से रह सकती हैं):

find . -type f -name foo -exec sh -c '
    for foo do
        ( cd "${foo%/*}" && somecommand foo )
    done' sh {} +

शब्दों में: मौजूदा निर्देशिका में या नीचे कहीं भी "फू" नामक सभी नियमित फाइलें ढूंढें और बैचों में इस शेल स्क्रिप्ट को अपना नाम दें। शेल स्क्रिप्ट दिए गए पथनामों पर पुनरावृति करेगा, निर्देशिका को प्रत्येक पथनाम के निर्देशिका भाग में बदल देगा और यदि वह सफल होता है, तो निष्पादित करें somecommand foo

एक समाधान के लिए जो गैरमानक का उपयोग करता है -execdir, रोआमा का जवाब देखें । उनका जवाब मेरे उदाहरण के अनुकूल है:

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