एकेक परिणाम याद करता है(बनाम grep)




ack (4)

मुझे यकीन है कि मुझे ack की फ़ाइल / निर्देशिका के बारे में कुछ गलतफहमी है कि यह चूक को अनदेखा करती है, लेकिन शायद कोई व्यक्ति इसके लिए कुछ प्रकाश डाल सके:

mbuck$ grep logout -R app/views/
Binary file app/views/shared/._header.html.erb.bak.swp matches
Binary file app/views/shared/._header.html.erb.swp matches
app/views/shared/_header.html.erb.bak: <%= link_to logout_text, logout_path, { :title => logout_text, :class => 'login-menuitem' } %>
mbuck$ ack logout app/views/
mbuck$

जहाँ तक...

mbuck$ ack -u logout app/views/
Binary file app/views/shared/._header.html.erb.bak.swp matches
Binary file app/views/shared/._header.html.erb.swp matches
app/views/shared/_header.html.erb.bak
98:<%= link_to logout_text, logout_path, { :title => logout_text, :class => 'login-menuitem' } %>

बस विकल्प के बिना ack को कॉल करना .bak फ़ाइल के भीतर परिणाम नहीं मिल सकता है, लेकिन --unrestricted विकल्प के साथ कॉल करने पर परिणाम मिल सकता है। जहाँ तक मैं बता सकता हूँ, हालाँकि, ack डिफ़ॉल्ट रूप से .bak फ़ाइलों को अनदेखा नहीं करता है।

अद्यतन करें

नीचे दिए गए उपयोगी टिप्पणियों के लिए धन्यवाद, यहां मेरी ~/.ackrc की नई सामग्री हैं:

--type-add=ruby=.haml,.rake
--type-add=css=.less

ack --man स्टेट्स:

यदि आप प्रत्येक फ़ाइल को खोजना चाहते हैं, यहां तक ​​कि यह भी कि यह हमेशा कोरपंप और बैकअप फ़ाइलों की तरह अनदेखा करता है, तो ".u" स्विच का उपयोग करें।

तथा

Ack डिफ़ॉल्ट रूप से अज्ञात फ़ाइलों को अनदेखा क्यों करता है? ack एक प्रोग्रामर द्वारा डिज़ाइन किया गया है, प्रोग्रामर के लिए, कोड के बड़े पेड़ों की खोज के लिए। अधिकांश कोडबेस के पास बहुत सारी फाइलें होती हैं जो स्रोत फाइलें नहीं होती हैं (जैसे संकलित ऑब्जेक्ट फाइलें, स्रोत नियंत्रण मेटाडेटा, आदि), और grep उन सभी के साथ-साथ उन फाइलों से लौटने और मिलान करने में बहुत समय बर्बाद करता है।

यही कारण है कि चीजों को नहीं पहचानने के लिए आक का व्यवहार इसकी सबसे बड़ी ताकत में से एक है: गति आपको केवल उन चीजों को खोजने से मिलती है जिन्हें आप देखना चाहते हैं।

EDIT: इसके अलावा अगर आप सोर्स कोड को देखते हैं, तो bak फाइलों को नजरअंदाज कर दिया जाता है।


यदि आप कभी भी इस बात को लेकर असमंजस में हों कि कौन सी फाइलें खोज रही हैं, तो बस -f विकल्प जोड़ें। यह उन सभी फाइलों को सूचीबद्ध करेगा जिन्हें यह खोजा जा सकता है।


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

मैन पेज से उद्धृत करने के लिए:

कोई फ़ाइल चयन नहीं होने से, ack-grep केवल उन प्रकार की फ़ाइलों को खोजता है जिन्हें वह पहचानता है। यदि आपके पास foo.wango नामक एक फ़ाइल है, और ack-grep को पता नहीं है कि .wango फ़ाइल क्या है, तो ack-grep इसे नहीं खोजेगा।

(ध्यान दें कि मैं उबंटू का उपयोग कर रहा हूं जहां नामकरण संघर्ष के कारण बाइनरी को ack-grep कहा जाता है)

ack --help-types प्रकार आपके ack स्थापना समर्थनों के प्रकारों की एक सूची दिखाएंगे।


Ack के साथ कुश्ती करने के बजाय, आप 1973 से सादे पुराने grep का उपयोग कर सकते हैं। क्योंकि यह स्पष्ट रूप से ब्लैक लिस्टेड फ़ाइलों का उपयोग करता है, श्वेतसूचीबद्ध फ़िल्टिप्स के बजाय, यह कभी भी सही परिणाम नहीं देता है, कभी भी। विन्यास की कुछ पंक्तियों को देखते हुए (जो मैंने 1990 के दशक में अपने होम डाइरेक्टरी 'डॉटफाइल्स' रेपो बैक में बनाई थी), grep वास्तव में ack के कई फायदे से मेल खाता है या उससे आगे निकलता है - विशेष रूप से, गति: जब फाइलों का एक ही सेट खोजते हैं, तो grep ack से तेज है।

Grep config जो मुझे खुश करता है, वह मेरे .bashrc में ऐसा दिखता है:

# Custom 'grep' behaviour
# Search recursively
# Ignore binary files
# Output in pretty colors
# Exclude a bunch of files and directories by name
# (this both prevents false positives, and speeds it up)
function grp {
    grep -rI --color --exclude-dir=node_modules --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude-dir=.tox --exclude=tags "[email protected]"
}

function grpy {
    grp --include=*.py "[email protected]"
}

अनदेखी करने के लिए फ़ाइलों और निर्देशिकाओं की सटीक सूची संभवतः आपके लिए अलग होगी: मैं ज्यादातर पायथन देव हूं और ये सेटिंग्स मेरे लिए काम करती हैं।

उप-कस्टमाइज़ेशन को जोड़ना भी आसान है, जैसा कि मैं अपने 'ग्रैपी' के लिए दिखाता हूं, कि मैं पायथन स्रोत का उपयोग करता हूं।

इस तरह के कार्य को परिभाषित करना GREP_OPTIONS को सेट करना बेहतर होता है, जो आपके द्वारा चलाए जाने वाले प्रोग्रामों द्वारा अलग-अलग व्यवहार करने के लिए आपके लॉगिन शेल से grep के सभी निष्पादन का कारण होगा। उन कार्यक्रमों को शायद grep के अप्रत्याशित रूप से अलग व्यवहार पर रोक दिया जाएगा।

मेरे नए कार्य, 'grp' और 'grpy', जानबूझकर 'grep' को छाया नहीं देते हैं, ताकि मैं अभी भी मूल व्यवहार का उपयोग कर सकूं, जब भी मुझे इसकी आवश्यकता हो।