मैं एक निर्देशिका में प्रत्येक फ़ाइल की पहली 50 पंक्तियों को कैसे पुनरावृत्ति करूँ?


10

मुझे हर फ़ाइल की पहली 50 पंक्तियों को एक निर्देशिका और उसकी उपनिर्देशिकाओं में खोजने की आवश्यकता है।

यह पुनरावर्ती भाग करेगा, लेकिन मैं प्रत्येक फ़ाइल के पहले 50 लाइनों को कैसे सीमित करूं?

grep -r "matching string here" .

इनमें से कुछ फाइलें बहुत बड़ी हैं, और मैं चाहता हूं कि वे पहले 50 लाइनों में मेल खाएं। मैं कुछ फाइलों में बाइनरी डेटा के मेगाबाइट को न खोजकर इस प्रक्रिया को गति देने की कोशिश कर रहा हूं।


क्या आप केवल उन फाइलों को जानना चाहते हैं जो मेल खाती हैं, या क्या आप बस मिलान स्ट्रिंग चाहते हैं या क्या आप फ़ाइल नाम के साथ मिलान स्ट्रिंग चाहते हैं?
gnourf_gniourf

जवाबों:


11
  • यदि आप केवल उन फ़ाइलों को चाहते हैं जो मेल खाती हैं:

    find . -type f -exec bash -c 'grep -q "matching string here" < <(head -n 50 "$1")' _ {} \; -printf '%p\n'
    

    या

    find . -type f -exec bash -c 'grep -q "matching string here" < <(head -n 50 "$1") && printf '%s\n' "$1"' _ {} \;
    
  • यदि आप केवल मिलान तार चाहते हैं:

    find . -type f -exec head -n 50 {} \; | grep "matching string here"
    

    या और अच्छा,

    find . -type f -exec head -q -n 50 {} + | grep "matching string here"
    
  • और अगर आप दोनों चाहते हैं:

    find . -type f -exec bash -c 'mapfile -t a < <(head -n 50 "$1" | grep "matching string here"); printf "$1: %s\n" "${a[@]}"' _ {} \;
    

टिप्पणियों।

  • sedकॉम्बो के बजाय थोड़ा आसान हो सकता है head- grep
  • मुझे इस बात पर जोर देना चाहिए कि तीनों विधियाँ फ़ाइल नामों के संबंध में 100% सुरक्षित हैं जिनमें अजीब प्रतीक (रिक्त स्थान, नई सूची आदि) हो सकते हैं।
  • इन विधियों में से दो में, मैं मान रहा हूँ कि आपके पास बैश का हालिया संस्करण है।
  • आप -exec ... +प्रत्येक विधि में उपयोग कर सकते हैं , लेकिन फिर आपको अपने आंतरिक लूप को स्वयं कोड करना होगा! (पाठक के लिए तुच्छ अभ्यास)। यदि आपके पास एक गज़िलियन फ़ाइलें हैं तो यह बहुत अधिक कुशल हो सकती है।

4

यदि आपको मूल रूप में grep आउटपुट की आवश्यकता है, तो आप कर सकते हैं:

find . -type f | while read f; do 
  if head -n 50 "$f"|grep -s "matching string here"; then
    grep "matching string here" "$f" /dev/null 
  fi
done

यदि आपको केवल फ़ाइल नामों की आवश्यकता है तो आप 2 grep को बदल सकते हैं echo "$f"


1

वांछित कार्यक्षमता प्राप्त करने के लिए आपको कुछ अलग उपयोगिताओं को संयोजित करने की आवश्यकता होगी। findनिर्देशिकाओं को पुनः प्राप्त करने के लिए कमांड का उपयोग करें , सभी फाइलों को ढूंढें और headपाया गया प्रत्येक फ़ाइल पर कमांड निष्पादित करें । headआदेश केवल पहले 50 प्रत्येक फ़ाइल की तर्ज डंप करने के लिए इस्तेमाल किया जा सकता। अंत में, अपने वांछित स्ट्रिंग की खोज के लिए grep पर आउटपुट को पाइप करें।

find . -type f -exec head -n 50 {} ";" | grep "matching string here"

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