डिफ़ॉल्ट रूप से बाइनरी फ़ाइलों को अनदेखा क्यों नहीं करता है?


94

के लिए मैनपेज grepका वर्णन करता है -Iझंडा इस प्रकार है:

-I      Ignore binary files.  This option is equivalent to 
        --binary-file=without-match option.

यह बाइनरी फ़ाइलों के बारे में यह भी कहता है:

 --binary-files=value Controls searching and printing of binary files.
         Options are binary, the default: search binary files but do not print
         them; without-match: do not search binary files; and text: treat all
         files as text.

मैं ऐसे परिदृश्य के बारे में नहीं सोच सकता जहाँ मैं बाइनरी फाइलों में मैचों के बारे में परवाह करूँ। यदि ऐसा कोई परिदृश्य मौजूद है, तो निश्चित रूप से यह आदर्श के बजाय अपवाद होना चाहिए। ऐसा grepकरने के लिए इस ध्वज को सेट करने की आवश्यकता के बजाय बाइनरी फ़ाइलों को डिफ़ॉल्ट रूप से अनदेखा क्यों नहीं किया जाता है?


4
आप चर GREP_OPTIONSको अपनी पसंदीदा सेटिंग्स पर सेट कर सकते हैं, फिर आपको कई कमांड लाइन स्विच का उपयोग करने की आवश्यकता नहीं है।
मार्को

2
अन्य आदेशों के लिए एक नोट जो इस तरह के एक चर का समर्थन नहीं करता है: आप अपने .(ba|z|foo)shrc': अन्य उपनाम grep = "grep -I" ` में एक उपनाम को परिभाषित करके डिफ़ॉल्ट विकल्प सेट कर सकते हैं ।
एरिक

1
यह वास्तव में बहुत उपयोगी हो सकता है। उदाहरण के लिए, मैं एक परियोजना के एकता संस्करण की खोज कर रहा था, और यह याद नहीं रख सका कि यह किस फ़ाइल में रखा गया था। मैंने संस्करण के प्रारूप की खोज की, और यह कुछ बाइनरी फ़ाइलों के साथ मेल खाता है। यह पूर्व संस्करण 5 के रूप में निकला, संस्करण केवल एक बाइनरी फ़ाइल में मौजूद था, इसलिए बाइनरी मैच के बिना, मैं इसे याद कर सकता था।
स्वेन्द हेन्सन

FYI करें वहाँ एक उपकरण ack है जो "grep से बेहतर" की तरह है। बाइनरी फ़ाइलों की खोज नहीं करता है। डेबियन में, यह "ऐक-ग्रीप" नाम से आता है।
तैका काज़ुरा

जवाबों:


91

ऐसा कुछ भी नहीं है जो लगता है कि grep एक बाइनरी फ़ाइल है, वास्तव में एक बाइनरी फ़ाइल है। उदाहरण के लिए कठपुतली के लॉग में एएनआई रंग कोडिंग है, जो कि grep को लगता है कि वे द्विआधारी हैं। अगर मैं / var / log के माध्यम से पकड़ रहा हूँ, तब भी मैं उन्हें खोजना चाहूंगा।


4
पीडीएफ फाइलों के लिए भी यही होता है।
जोसेफ आर।

12
+ ऐतिहासिक रूप से grep ऐसा नहीं कर सका, इसलिए केवल अनुकूलता के लिए, डिफ़ॉल्ट को सर्व-समावेशी होना चाहिए।
ओलिवियर दुलक

2
@OlivierDulac यह समझ में आता है, अन्यथा बाइनरी फ़ाइलों को अनदेखा करना डिफ़ॉल्ट होना चाहिए।
दगांग

5

grepबाइनरी फ़ाइलों को खोजने की क्षमता भी उपयोगी है जब मैं एक कार्यक्रम को संकलित कर रहा हूं और लिंकर ( ld) कुछ फ़ंक्शन के नहीं मिलने की शिकायत करता है। मैं जैसे कमांड का उपयोग कर सकता हूं

grep function_name / lib / lib *

लाइब्रेरी को खोजने के लिए जिसमें यह शामिल है। (पुस्तकालय बाइनरी फाइलें हैं।)


उस स्थिति में, आप grep -l function_name /lib/lib*या तो उपयोग करेंगे nm -Do /lib/lib* | grep function_nameया ldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_nameयद्यपि।
स्टीफन चेजलस

ठीक है, grep some_function /lib/*छोटा है और आमतौर पर सही उत्तर देता है - लाइब्रेरी का नाम, जिसकी मुझे तलाश है। लेकिन हाँ, कभी-कभी अपने लोगों की तरह अधिक परिष्कृत दृष्टिकोण की भी आवश्यकता होती है।
डैनियल फ्रूटीस्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.