मैं find
एक फाइल कर रहा हूं और फिर फाइलों की एक सूची प्राप्त कर रहा हूं । मैं इसे अन्य उपयोगिता की तरह कैसे पाइप कर सकता हूं cat
(ताकि बिल्ली उन सभी फ़ाइलों की सामग्री को प्रदर्शित करे) और मूल रूप grep
से इन फ़ाइलों से कुछ की आवश्यकता है ।
मैं find
एक फाइल कर रहा हूं और फिर फाइलों की एक सूची प्राप्त कर रहा हूं । मैं इसे अन्य उपयोगिता की तरह कैसे पाइप कर सकता हूं cat
(ताकि बिल्ली उन सभी फ़ाइलों की सामग्री को प्रदर्शित करे) और मूल रूप grep
से इन फ़ाइलों से कुछ की आवश्यकता है ।
जवाबों:
किसी अन्य प्रक्रिया के लिए पाइपिंग (हालाँकि यह वह नहीं है जो आपने कहा था कि आप क्या करने की कोशिश कर रहे हैं):
command1 | command2
यह कमांड 1 के आउटपुट को कमांड 2 के इनपुट के रूप में भेजेगा
-exec
find
इस पर (यह वही करेगा जो आप करना चाहते हैं - लेकिन यह विशिष्ट है find
)
find . -name '*.foo' -exec cat {} \;
(सब कुछ के बीच में हैं find
और -exec
आप पहले से ही उपयोग कर रहे हैं की भविष्यवाणी कर रहे हैं। {}
कमांड में पाया गया विशेष फ़ाइल स्थानापन्न कर देगा ( cat {}
इस मामले में), कमांड \;
को समाप्त करने के लिए है -exec
।)
एक प्रक्रिया के आउटपुट को कमांड लाइन के तर्क के रूप में दूसरी प्रक्रिया में भेजें
command2 `command1`
उदाहरण के लिए:
cat `find . -name '*.foo' -print`
(ध्यान दें कि ये BACK-QUOTES नियमित उद्धरण नहीं हैं (मेरे कीबोर्ड पर tilde ~ के तहत)।) यह कमांड लाइन के तर्कों के रूप command1
में आउटपुट भेजेगा command2
। ध्यान दें कि रिक्त स्थान (newlines, आदि) वाले फ़ाइल नाम अलग-अलग तर्कों में टूट जाएंगे, हालाँकि।
find
आपको लिखने की अनुमति देते हैं: find . -name '*.foo' -exec cat {} +
जहां +
इंगित करता है कि find
एक एकल कमांड आह्वान में सुविधाजनक के रूप में कई फ़ाइल नामों के रूप में समूह होना चाहिए। यह काफी उपयोगी है (यह बिना किसी का सहारा लिए -print0
और फ़ाइल नामों में रिक्त स्थान आदि से संबंधित है xargs -0
)।
find . -name '*.foo' | xargs cat
find . -name '*.foo' | xargs cat | grep string
POSIX 2008 ने +
मार्कर को जोड़ा find
जिसका अर्थ है कि यह अब स्वचालित रूप से कई फाइलों को एक कमांड कमांड में उचित रूप से समूह xargs
करता है, बहुत पसंद करता है, लेकिन कई फायदे के साथ:
फ़ाइल नाम समस्या विकल्प के xargs
बिना एक समस्या है -0
, और 'शून्य फ़ाइल नाम के साथ भी चलाएँ' समस्या -0
विकल्प के साथ या उसके बिना समस्या है - लेकिन GNU के xargs
पास -r
या --no-run-if-empty
ऐसा होने से रोकने का विकल्प है। इसके अलावा, यह अंकन प्रक्रियाओं की संख्या में कटौती करता है, न कि यह कि आप प्रदर्शन के अंतर को माप सकते हैं। इसलिए, आप समझदारी से लिख सकते हैं:
find . -exec grep something {} +
find . -print | xargs grep something
आप लिनक्स पर हैं या जीएनयू है find
और xargs
आदेश, तो का उपयोग -print0
के साथ find
और -0
साथ xargs
संभाल फ़ाइल रिक्त स्थान और अन्य सभी छोटे गेंद वर्ण युक्त नाम के लिए।
find . -print0 | xargs -0 grep something
grep
यदि आप फ़ाइल नाम (केवल पाठ) नहीं चाहते हैं, तो एक उपयुक्त विकल्प जोड़ें grep
(आमतौर -h
पर 'शीर्षकों' को दबाने के लिए)। बिल्कुल गारंटी करने के लिए फ़ाइल नाम से छपा है grep
(भले ही केवल एक फ़ाइल पाया जाता है, या के अंतिम मंगलाचरण grep
केवल 1 फ़ाइल नाम दिया जाता है), तो जोड़ने /dev/null
के लिए xargs
कमांड लाइन है, ताकि वहाँ हमेशा कम से कम दो फ़ाइल नाम हो जाएगा।
xargs grep something
।
find
मानक इनपुट के लिए पाइप किया गया है xargs
। xargs
कार्यक्रम अपने मानक इनपुट पढ़ता है, सफेद स्थान पर इनपुट बंटवारे (कारतूस, नई-पंक्तियों, टैब, आदि) और आदेश के लिए शब्दों की एक संख्या जोड़ देती है grep something
और कमांड लाइन निष्पादित करता है। xargs
तब तक इनपुट पढ़ना और कमांड निष्पादित करना जारी रखता है जब तक कि यह इनपुट से बाहर न चला जाए। यह दिए गए इनपुट के लिए जितनी बार आवश्यक हो कमांड xargs
चलाता grep
है ( find
इस उदाहरण से)।
/dev/null
त्रुटि संदेशों को खोने के लिए stderr को पुनर्निर्देशित करना ।
find
कमांड द्वारा कमांड में लौटाए गए फाइलों की सूची को पास करने के कुछ तरीके हैं cat
, हालांकि तकनीकी रूप से सभी पाइपिंग का उपयोग नहीं करते हैं, और वास्तव में कोई भी सीधे पाइप नहीं करता है cat
।
सबसे सरल है बैकटिक्स का उपयोग करना ( `
):
cat `find [whatever]`
इसका आउटपुट लेता है find
और इसे प्रभावी रूप से कमांड लाइन पर रखता है cat
। यदि find
बहुत अधिक आउटपुट (कमांड-लाइन पर फिट हो सकता है) या यदि आउटपुट में विशेष वर्ण (जैसे रिक्त स्थान) हैं तो यह अच्छी तरह से काम नहीं करता है ।
सहित कुछ गोले में bash
, एक का उपयोग कर सकते हैं $()
backticks के बजाय:
cat $(find [whatever])
यह कम पोर्टेबल है, लेकिन नेस्टेबल है। उस के अलावा, यह बहुत ज्यादा backticks के रूप में एक ही चेतावनी है।
क्योंकि जो पाया गया था उस पर अन्य कमांड चलाना एक सामान्य उपयोग है find
, खोजने के लिए एक -exec
एक्शन है जो प्रत्येक फ़ाइल के लिए एक कमांड निष्पादित करता है जो यह पाता है:
find [whatever] -exec cat {} \;
{}
फ़ाइल नाम के लिए प्लेसहोल्डर है, और \;
निशान आदेश के अंत में (यह संभव है के बाद अन्य कार्यों के लिए -exec
।)
यह cat
हर एक फ़ाइल के लिए एक बार चलने के बजाय एक बार cat
इसे कई फाइलनामों को पारित करने के लिए चलाएगा जो अक्षम हो सकता है और आपके पास कुछ आज्ञाओं के लिए इच्छित व्यवहार नहीं हो सकता है (हालांकि यह इसके लिए ठीक है cat
)। सिंटैक्स भी टाइप करने के लिए एक अजीब है - आपको अर्धविराम से बचने की आवश्यकता है क्योंकि अर्धविराम शेल के लिए विशेष है!
के कुछ संस्करणों find
(सबसे विशेष रूप जीएनयू संस्करण) आप की जगह जाने ;
के साथ +
उपयोग करने के लिए -exec
'के कम उदाहरणों को चलाने के लिए रों संलग्न मोड cat
:
find [whatever] -exec cat {} +
यह प्रत्येक इनवोकेशन के लिए कई फाइलनाम पास करेगा cat
, जो अधिक कुशल हो सकता है।
ध्यान दें कि यह एकल आह्वान का उपयोग करने की गारंटी नहीं है , हालांकि। यदि कमांड लाइन बहुत लंबी होगी, तो तर्कों को कई आक्रमणों में फैलाया जाएगा cat
। इसके लिए cat
शायद कोई बड़ी बात नहीं है, लेकिन कुछ अन्य आदेशों के लिए यह अवांछनीय तरीकों से व्यवहार को बदल सकता है। लिनक्स सिस्टम पर, कमांड लाइन की लंबाई सीमा काफी बड़ी है, इसलिए कुछ अन्य ओएस की तुलना में कई इनवोकेशन में विभाजन काफी दुर्लभ है।
क्लासिक / पोर्टेबल दृष्टिकोण का उपयोग करना है xargs
:
find [whatever] | xargs cat
xargs
निर्दिष्ट कमांड चलाता है ( cat
इस मामले में), और स्टड से जो भी पढ़ता है, उसके आधार पर तर्क जोड़ता है। वैसे ही जैसे -exec
के साथ +
, यह ऊपर कमांड लाइन यदि आवश्यक हो तो टूट जाएगा। यही है, अगर find
बहुत अधिक उत्पादन होता है, तो यह cat
कई बार चलेगा । जैसा कि -exec
पहले के बारे में अनुभाग में बताया गया है, कुछ कमांड हैं जहां इस विभाजन के परिणामस्वरूप अलग व्यवहार हो सकता है। ध्यान दें कि xargs
इस तरह के उपयोग से फ़ाइल नाम में रिक्त स्थान के साथ समस्याएँ होती हैं, जैसे xargs
कि व्हिम्सस्पेस को एक सीमांकक के रूप में उपयोग किया जाता है।
सबसे मजबूत, पोर्टेबल और कुशल विधि भी उपयोग करती है xargs
:
find [whatever] -print0 | xargs -0 cat
-print0
ध्वज बताता है find
उपयोग करने के लिए \0
(शून्य चरित्र) सीमांकक फ़ाइल नामों के बीच, और -0
ध्वज बताता है xargs
इन की उम्मीद \0
सीमांकक। यह बहुत अधिक समान व्यवहार है -exec
... +
दृष्टिकोण, हालांकि अधिक पोर्टेबल है (लेकिन दुर्भाग्य से अधिक क्रिया)।
ls
, जैसे कि ।
$()
अलावा अन्य कमांड के साथ भी काम करता है find
।
मेरे लिए एक शेल स्क्रिप्ट की नौकरी की तरह लगता है:
for file in 'find -name *.xml'
do
grep 'hello' file
done
या कुछ इस तरह का
खोज कमांड में एक -exec तर्क है जिसे आप इस तरह की चीजों के लिए उपयोग कर सकते हैं, आप बस सीधे grep का उपयोग कर सकते हैं।
उदाहरण के लिए ( यहाँ से, इस पृष्ठ पर अन्य अच्छे उदाहरण ):
find . -exec grep "www.athabasca" '{}' \; -print
बैश में, निम्नलिखित उपयुक्त होगा:
find /dir -type f -print0 | xargs -0i cat {} | grep whatever
यह /dir
डायरेक्टरी की सभी फाइलों को ढूंढ लेगा और सुरक्षित रूप से फाइलनाम को पाइप xargs
करेगा, जो सुरक्षित रूप से ड्राइव करेगा grep
।
xargs
यदि आपके पास कई हजारों फाइलें हैं /dir
, तो लंघन एक अच्छा विचार नहीं है ; cat
अत्यधिक तर्क सूची की लंबाई के कारण टूट जाएगा। xargs
आपके लिए यह सब छांटेगा।
-print0
करने के लिए तर्क find
के साथ meshes -0
तर्क को xargs
रिक्तियों के साथ फ़ाइल नाम ठीक से संभाल। -i
करने के लिए तर्क xargs
आप फ़ाइल नाम जहां में आवश्यक डालने के लिए अनुमति देता है cat
कमांड लाइन। कोष्ठक से प्रतिस्थापित नाम फ़ाइलनाम द्वारा प्रतिस्थापित किया जाता cat
है find
।
यह मेरे लिए काम करता है
find _CACHE_* | while read line; do
cat "$line" | grep "something"
done
Ggrep का उपयोग करें ।
ggrep -H -R -I "mysearchstring" *
वर्तमान निर्देशिका या उपनिर्देशिका में स्थित पाठ वाले यूनिक्स में एक फ़ाइल की खोज करने के लिए
यह केवल पुनरावर्ती फ़ाइलों का नाम और सामग्री मुद्रित करेगा।
find . -type f -printf '\n\n%p:\n' -exec cat {} \;
संपादित करें (बेहतर संस्करण): यह नाम और पाठ की सामग्री (ascii) को केवल पुनरावर्ती रूप से मुद्रित करेगा।
find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'
एक और कोशिश
find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;
क्या आप फ़ाइलों में पाठ खोजने का प्रयास कर रहे हैं? आप बस उस के लिए grep का उपयोग कर सकते हैं ...
grep searchterm *
निर्देशिका और ghi और / jkl में एक सर्वर पर सभी abc.def फ़ाइलों की सामग्री को सूचीबद्ध करने और देखने के लिए
find /ghi /jkl -type f -name abc.def 2> /dev/null -exec ls {} \; -exec cat {} \;
Abc.def फ़ाइलों को सूचीबद्ध करने के लिए, जिन्होंने प्रविष्टियों पर टिप्पणी की है और उन प्रविष्टियों को निर्देशिका / ghi और / jkl में देखते हैं
find /ghi /jkl -type f -name abc.def 2> /dev/null -exec grep -H ^# {} \;
find -name '*.foo' -print
ने मेरे लिए बहुत अच्छा काम किया ... धन्यवाद