मैं किसी भी और सभी फ़ाइलों को स्ट्रिंग "हैलो" के लिए वर्तमान निर्देशिका को खोजने के लिए grep का उपयोग कैसे करूं और केवल .h और .cc फ़ाइलों को प्रदर्शित करूं?
मैं किसी भी और सभी फ़ाइलों को स्ट्रिंग "हैलो" के लिए वर्तमान निर्देशिका को खोजने के लिए grep का उपयोग कैसे करूं और केवल .h और .cc फ़ाइलों को प्रदर्शित करूं?
जवाबों:
grep -r --include=*.{cc,h} "hello" .
यह पढ़ता है: सभी .cc या .h फ़ाइलों के लिए पुनरावर्ती (सभी उप निर्देशिकाओं में) इस .
(वर्तमान) निर्देशिका में "हैलो" सम्मिलित करें।
आप फ़ाइल नाम निर्दिष्ट करने या स्टडिन का उपयोग करने के बजाय वाइल्डकार्ड में पास कर सकते हैं।
grep hello *.h *.cc
-R
दुर्भाग्य से काम नहीं करता है। यह *
पुनरावर्ती जाने से पहले फैलता है ।
find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"
।
विवरण के लिए find
और के xargs
लिए मैनुअल पृष्ठों की जाँच करें ।
-print0
बाद एक होना चाहिए '*.cc'
अन्यथा आपके पास खोज के उस भाग के लिए कोई कार्रवाई नहीं है। या आपको वहाँ कोष्ठक सम्मिलित करना होगा find . \( -name '*.cc' -or -name '*.h' \) -print0
:।
find -exec +
xargs के बजाय सिंटैक्स का उपयोग भी कर सकते हैं
-exec grep "hello" {} +
जहाँ ब्रेसिज़ की जोड़ी फ़ाइल के नाम का प्रतिनिधित्व करती है। अच्छा सुझाव।
यदि आपको एक पुनरावर्ती खोज की आवश्यकता है, तो आपके पास विभिन्न प्रकार के विकल्प हैं। आपको विचार करना चाहिए ack
।
यदि आपको GNU find
और xargs
:
find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null
यह /dev/null
सुनिश्चित करता है कि आपको फ़ाइल नाम छपे हों; -print0
और -0
फ़ाइल वाले रिक्त स्थान के नाम (नई-पंक्तियों, आदि) से संबंधित है।
यदि आपके पास स्थैतिक नाम (रिक्त स्थान आदि के साथ) नहीं हैं, तो आप उपयोग कर सकते हैं:
find . -name '*.*[ch]' -print | xargs grep hello /dev/null
यह उन कुछ नामों को ले सकता है जिन्हें आपने इरादा नहीं किया था, क्योंकि पैटर्न मैच फ़्यूज़ियर (लेकिन सरल) है, लेकिन अन्यथा काम करता है। और यह गैर-जीएनयू संस्करणों के साथ काम करता है find
और xargs
।
find ... -exec grep "hello" {} +
यदि मैं आपके प्रश्न को ध्यान से पढ़ता हूं, तो आप "grep से किसी भी और सभी फ़ाइलों के लिए वर्तमान निर्देशिका को खोजने के लिए कहेंगे जिसमें स्ट्रिंग" हैलो "है और केवल .h और .cc फाइलें प्रदर्शित करें"। तो अपनी सटीक आवश्यकताओं को पूरा करने के लिए यहाँ प्रस्तुत है:
यह फ़ाइल नाम प्रदर्शित करता है:
grep -lR hello * | egrep '(cc|h)$'
... और यह फ़ाइल नाम और सामग्री प्रदर्शित करता है:
grep hello `grep -lR hello * | egrep '(cc|h)$'`
grep -l hello **/*.{h,cc}
यदि आप shopt -s nullglob
.h या no .cc फ़ाइलें नहीं हैं, तो आप त्रुटि संदेशों से बचना चाह सकते हैं ।
सबसे सरल तरीका: grep -Ril "आपका पाठ" /
grep -si "hello" --include=*.{cc,h} ./* ./.*
(साथ ही छिपी हुई फ़ाइलों को खोजता है)। यहां सभी / छिपी हुई फ़ाइलों में एक स्ट्रिंग की खोज करने के लिए एक सामान्य संस्करण हैgrep -s "hello" * .*
:। शायद सबसे आम तौर पर उपयोगी (और सरल), यह "हैलो" के लिए सभी गैर-छिपी हुई फ़ाइलों को खोजता है:grep -si "hello" ./*
इस पोस्ट के लिए धन्यवाद: askubuntu.com/a/777456