यह काम नहीं कर रहा है। क्या इसे खोजने में किया जा सकता है? या मुझे xargs की आवश्यकता है?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
यह काम नहीं कर रहा है। क्या इसे खोजने में किया जा सकता है? या मुझे xargs की आवश्यकता है?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
जवाबों:
कई प्रक्रियाओं को चलाने और एक प्रक्रिया के आउटपुट को किसी अन्य प्रक्रिया के इनपुट में पाइप के रूप में पाइप के प्रतीक की व्याख्या करने का काम शेल (/ बिन / श या समकक्ष) की जिम्मेदारी है।
अपने उदाहरण में आप या तो पाइपिंग करने के लिए अपने शीर्ष स्तर के खोल का उपयोग कर सकते हैं:
find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'
कार्यकुशलता के संदर्भ में इस परिणाम में खोज का एक आह्वान, zcat के कई आह्वान, और agrep का एक आह्वान शामिल है।
इसके परिणामस्वरूप केवल एक एग्रेप प्रक्रिया को जन्म दिया जाता है, जो कि zcat के कई आह्वान द्वारा उत्पादित सभी उत्पादन को संसाधित करेगा।
यदि आप किसी कारण से कई बार agrep को आमंत्रित करना चाहते हैं, तो आप कर सकते हैं:
find . -name 'file_*' -follow -type f \
-printf "zcat %p | agrep -dEOE 'grep'\n" | sh
यह निष्पादित करने के लिए पाइप का उपयोग करते हुए आदेशों की एक सूची का निर्माण करता है, फिर उन्हें वास्तव में निष्पादित करने के लिए एक नए शेल में भेजता है। (अंतिम "O | शिम" को इस तरह कमांड लाइन के डिबग या ड्राई रन करने का अच्छा तरीका है।)
दक्षता के संदर्भ में इस परिणाम में खोज का एक आह्वान, श का एक आह्वान, zcat के कई आह्वान और agrep के कई आह्वान शामिल हैं।
आदेश की संख्या के संदर्भ में सबसे कुशल समाधान पॉल टॉम्बलिन का सुझाव है:
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
... जिसे खोजने में एक आह्वान, एक झटके का आह्वान, zcat के कुछ आह्वान और agrep के एक आह्वान का खर्च आता है।
-exec sh -c "… | … " \;
।
समाधान आसान है: श के माध्यम से निष्पादित करें
... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;
-c
विकल्प की अनदेखी न करें । अन्यथा आपको एक puzzling No such file or directory
त्रुटि संदेश मिलेगा ।
find -type f -name '*.mdds' -exec sh -c "echo {} | sed -e 's/_[0-9]\+//g' | xargs mv {}" \;
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
आप एक while
लूप पर भी पाइप कर सकते हैं जो उस फ़ाइल पर कई क्रियाएं कर सकता है जो find
लोकेट करता है। तो यहाँ फ़ाइलों jar
की एक बड़ी distro के साथ फ़ोल्डर में किसी दिए गए java क्लास फ़ाइल के लिए अभिलेखागार में देखने के लिए एक हैjar
find /usr/lib/eclipse/plugins -type f -name \*.jar | while read jar; do echo $jar; jar tf $jar | fgrep IObservableList ; done
मुख्य बिंदु यह है कि while
लूप में कई कमांड होते हैं जो सेमीकॉलन द्वारा अलग किए गए फ़ाइल नाम में पारित का उल्लेख करते हैं और इन कमांड में पाइप शामिल हो सकते हैं। तो उस उदाहरण में, मैं मिलान फ़ाइल के नाम की प्रतिध्वनि करता हूं, फिर सूची में दिए गए वर्ग नाम के लिए संग्रह फ़िल्टरिंग में क्या है। आउटपुट ऐसा दिखता है:
/usr/lib/eclipse/plugins/org.eclipse.core.contenttype.source_3.4.1.R35x_v20090826-0451.jar/usr/lib/eclipse/plugins/org.eclipse.core.databinding.observinding_1.2.0.M200902-0902 .jar org / eclipse / core / databinding / observable / list / IObservableLLclclass /usr/lib/eclipse/plugins/ org.eclipse.search.source.ch3 / 5.1.r351_v20090708-0800.jar / usr / lib / plugins / करें। org.eclipse.jdt.apt.core.source_3.3.202.R35x_v20091130-2300.jar/usr/lib/eclipse/plugins/org.eclipse.cv.source_1.0.400.v201002111343.jar / usr / lib / plugins / org.eclipse.help.appserver_3.1.400.v20090429_1800.jar
मेरे बैश शेल (xubuntu10.04 / xfce) में यह मिलान fgrep
किए गए स्ट्रिंग को हाइलाइट करने के रूप में मिलान किए गए क्लासनाम को बोल्ड बनाता है ; यह उन सैकड़ों jar
फ़ाइलों की सूची को स्कैन करना वास्तव में आसान बनाता है जिन्हें खोजा गया था और आसानी से कोई भी मैच देख सकता था।
खिड़कियों पर आप एक ही काम कर सकते हैं:
for /R %j in (*.jar) do @echo %j & @jar tf %j | findstr IObservableList
ध्यान दें कि विंडोज़ में कमांड विभाजक 'और' नहीं 'है;' और यह कि '@' ठीक उसी तरह टंकल आउटपुट देने के लिए कमांड की प्रतिध्वनि को दबाता है, जैसे कि लिनक्स ऊपर आउटपुट खोजता है; हालाँकि findstr
, मिलान किए गए स्ट्रिंग को बोल्ड नहीं बनाता है, इसलिए आपको मिलान किए गए वर्ग नाम को देखने के लिए आउटपुट पर थोड़ा करीब देखना होगा। यह पता चला है कि 'कमांड' के लिए विंडोज़ '' बहुत कुछ ट्रिक्स जानता है जैसे टेक्स्ट फाइल के माध्यम से लूपिंग ...
का आनंद लें
मैंने पाया कि एक स्ट्रिंग शेल कमांड (sh -c) सबसे अच्छा काम करता है, उदाहरण के लिए:
find -name 'file_*' -follow -type f -exec bash -c "zcat \"{}\" | agrep -dEOE 'grep'" \;
यदि आप एक सरल विकल्प की तलाश कर रहे हैं, तो यह एक लूप का उपयोग करके किया जा सकता है:
for i in $(find -name 'file_*' -follow -type f);do zcat $i | agrep -dEOE 'grep');done
या, अधिक सामान्य और समझने में आसान रूप:
for i in $(YOUR_FIND_COMMAND);do YOUR_EXEC_COMMAND_AND_PIPES );done
और किसी भी {} को i_EXEC_COMMAND_AND_PIPES में $ i से बदल दें