Ack वाली सभी फाइलों को खोजें


14

मैं v2 के साथ वर्तमान निर्देशिका में सभी फाइलें (बाइनरी सहित) कैसे खोज सकता हूं ack?

मैं कर के रूप में एक ही करना चाहते हैं ack 'foo' **, लेकिन सिर्फ एक ध्वज के साथ, इसलिए यह काम करता है अगर मैं एक विशेष निर्देशिका में सभी फ़ाइलों को बिना संलग्न किए खोज करना चाहता हूं **


के बीच अंतर ack 'foo'और ack 'foo' **:

$ mkdir test && cd test
$ printf '\x00\x01foo1\x00' > test1
$ printf 'foo2' > test2
$ ack 'foo'
test2
1:foo2
$ ack 'foo' **
test1
1:foo1

test2
1:foo2

आप grep के बजाय इसके लिए ack का उपयोग क्यों करना चाहते हैं?
एंडी लेस्टर

1
@AndyLester मुझे लगा कि ackहमेशा से बेहतर है grep। मैं गलत था :)।
टायिलो

जवाबों:


6

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

मेरा मानना ​​है कि पुराने Ack संस्करण द्विआधारी फ़ाइलों के माध्यम से खोज करेंगे जब आपने उन्हें --binaryध्वज पारित किया था । हालांकि इस झंडे को हटा दिया गया है। आप इसके बजाय grep का उपयोग करने में सक्षम हो सकते हैं।

grep -ar 'foo' .

इसका सिम्बलिंक से कोई लेना-देना नहीं है। यह बाइनरी फ़ाइलों के साथ करना है!
टिलो जूल

@ टायिलो: मैंने अपना उत्तर संशोधित कर लिया है।

13

जब आप ack के लिए कोई फ़ाइल नाम नहीं देते हैं, तो यह उन फ़ाइलों के अंतर्निहित डिफ़ॉल्ट सेट पर संचालित होता है, जो बिना पहचानी बाइनरी फ़ाइलों को शामिल करता है। यदि आप फ़ाइल नाम पास करते हैं, तो यह आपके द्वारा पास की गई सभी फ़ाइलों में खोज करता है। यह ack fooऔर के बीच का अंतर बताता है ack foo **

एक १

1.x सेकंड में, ध्वज का उपयोग करें -a को बताने के का वह फाइलों को न छोड़ें जिनके प्रकार को वह नहीं पहचानता।

अगर आपको लगता है कि झंडा अधिक बार नहीं की तुलना में चाहते हैं तो आप एक उपनाम बना सकते हैं: लाइन जोड़ने alias ack='ack -a'में अपने ~/.bashrcया ~/.zshrc। यदि आप इस उपनाम को सेट करते हैं और ackविकल्प के बिना कॉल करना चाहते हैं , तो कॉल करें \ack(बैकस्लैश अन्य उपनाम को अक्षम करता है)। अलिंद से प्रभावित नहीं होते हैं, केवल इंटरैक्टिव गोले।

वैकल्पिक रूप से, आप -aअपने लिए विकल्प जोड़ सकते हैं~/.ackrc

बाइनरी फ़ाइलों में मेल "बाइनरी फ़ाइल टेस्ट 1 मैचों" के रूप में सूचीबद्ध किया जाएगा। Ack को संशोधित किए बिना (कम से कम प्लगइन जोड़ने) इस व्यवहार को अक्षम करने का कोई तरीका नहीं है।

एकेक २

Ack 2.0 में, -aविकल्प को हटा दिया गया है। इसके बजाय आप जो कर सकते हैं वह एक प्रकार को परिभाषित करने के लिए है जो सभी फ़ाइलों से मेल खाता है, और -kविकल्प बनाने के लिए ack बनाने के लिए उस प्रकार की सभी फ़ाइलों को शामिल करें। ध्यान दें कि फ़ाइल प्रकारों को एक अप्रत्याशित क्रम में संसाधित किया जाता है, इससे बाइनरी प्रकारों का एक यादृच्छिक सेट सामान्य प्रकार के बजाय साधारण के रूप में संसाधित किया जाएगा।

ack --type-set='all:match:.*' -k foo

इस तरह मैच उन फाइलों के लिए भी प्रिंट किए जाते हैं जो अन्यथा बाइनरी दिखेंगी। ऊपर के रूप में, आप इन विकल्पों को एक उपनाम या अपने में जोड़ सकते हैं .ackrc


1
वह बहुत डरपोक है, @ गिल्स।
एंडी लेस्टर

@AndyLester, -a विकल्प को क्यों हटाया गया? "यह इसलिए है क्योंकि" रिटर्न में वास्तव में यह नहीं समझाता है कि मैं अब बिना पहचाने गए फ़ाइल प्रकारों को क्यों नहीं खोज सकता।
यन दोनंदल

क्योंकि सभी गैर-मान्यता प्राप्त पाठ फ़ाइलों को खोजने के लिए 1.x -a व्यवहार, अब 2.0 में डिफ़ॉल्ट है।
एंडी लेस्टर

2
अजीब, मेरे पास एक छोटा जेएस फाइल है जो उस विशेष मैच-प्रकार के प्रकार के सेट पर भी नहीं मिल सकता है ...
इज़काता जनता

मैं यहाँ इस वजह से हूँ: एक minified js फ़ाइल के अंदर एक पाठ, जिसे ack द्वारा पार्स नहीं किया गया है। मुझे लगा कि जवाब "ऐड-ए" जैसा होगा ... मैं असंतुष्ट हूं।
लुसियानो फैंटुजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.