unix - Grep का उपयोग करें-exclude/- कुछ फ़ाइलों के माध्यम से grep नहीं करने के लिए वाक्यविन्यास शामिल करें
search shell (15)
निर्देशिका में भी कई बाइनरी फ़ाइलें हैं। मैं केवल कुछ निर्देशिका नहीं खोज सकता (निर्देशिका संरचना एक बड़ी गड़बड़ है)। क्या केवल कुछ फाइलों में grepping का एक बेहतर तरीका है?
ripgrep
यह आपकी वर्तमान निर्देशिका को दोबारा खोजने के लिए डिज़ाइन किए गए सबसे तेज़ टूल में से एक है। यह Rust में लिखा गया है, जो अधिकतम दक्षता के लिए जंग के रेगेक्स इंजन के शीर्ष पर बनाया गया है। विस्तृत विश्लेषण यहां देखें ।
तो आप बस दौड़ सकते हैं:
rg "some_pattern"
यह आपके .gitignore
सम्मान करता है और स्वचालित रूप से छिपी हुई फ़ाइलों / निर्देशिकाओं और बाइनरी फ़ाइलों को छोड़ देता है।
आप अभी भी -g
/ --glob
का उपयोग कर फ़ाइलों और निर्देशिकाओं को शामिल या बहिष्कृत कर सकते हैं। Globbing नियम मिलान .gitignore globs। मदद के लिए man rg
जांचें।
मैकोज़ पर, आप brew install ripgrep
माध्यम से स्थापित कर सकते हैं।
मैं एक निर्देशिका पेड़ में पाठ फ़ाइलों में स्ट्रिंग foo=
तलाश में हूँ। यह एक आम लिनक्स मशीन पर है, मेरे पास बैश खोल है:
grep -ircl "foo=" *
निर्देशिका में कई बाइनरी फ़ाइलें भी हैं जो "foo =" से मेल खाते हैं। चूंकि ये परिणाम प्रासंगिक नहीं हैं और खोज को धीमा कर देते हैं, मैं चाहता हूं कि grep इन फ़ाइलों को खोजना छोड़ दें (ज्यादातर जेपीईजी और पीएनजी छवियां)। मुझे यह कैसे करना है?
मुझे पता है कि --include=PATTERN
--exclude=PATTERN
और --include=PATTERN
विकल्प हैं, लेकिन पैटर्न प्रारूप क्या है? Grep का आदमी पृष्ठ कहता है:
--include=PATTERN Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN Recurse in directories skip file matching PATTERN.
Grep पर खोज में शामिल हैं , grep शामिल करना शामिल है , grep बहिष्कृत करें और वेरिएंट को कुछ भी प्रासंगिक नहीं मिला
यदि केवल कुछ फ़ाइलों में grepping का एक बेहतर तरीका है, तो मैं इसके लिए सब कुछ कर रहा हूं; अपमानजनक फ़ाइलों को स्थानांतरित करना एक विकल्प नहीं है। मैं केवल कुछ निर्देशिकाओं को नहीं खोज सकता (निर्देशिका संरचना एक बड़ी गड़बड़ी है, हर जगह सबकुछ के साथ)। इसके अलावा, मैं कुछ भी इंस्टॉल नहीं कर सकता, इसलिए मुझे सामान्य टूल्स (जैसे grep या सुझाए गए खोज ) के साथ करना है।
git grep
git grep
प्रयोग करें जो प्रदर्शन के लिए अनुकूलित है और कुछ फ़ाइलों के माध्यम से खोज करना है।
डिफ़ॉल्ट रूप से यह बाइनरी फाइलों को अनदेखा करता है और यह आपके .gitignore
का सम्मान कर रहा है। यदि आप गिट संरचना के साथ काम नहीं कर रहे हैं, तो आप अभी भी --no-index
पास करके इसका उपयोग कर सकते हैं।
उदाहरण वाक्यविन्यास:
git grep --no-index "some_pattern"
कुछ फ़ाइलों को अभी भी बाहर करने के लिए, देखें: git grep खोज से कुछ निर्देशिका / फ़ाइलों को कैसे बाहर निकालें ।
Grep 2.5.1 में आपको यह लाइन ~ / .bashrc या ~ / .bash प्रोफ़ाइल में जोड़नी होगी
export GREP_OPTIONS="--exclude=\*.svn\*"
Grep से सभी बाइनरी परिणामों को अनदेखा करने के लिए
grep -Ri "pattern" * | awk '{if($1 != "Binary") print $0}'
अजीब हिस्सा सभी बाइनरी फ़ाइल foo मिलान लाइनों को फ़िल्टर करेगा
tcsh .alias फ़ाइल के लिए उपयुक्त:
alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'
मुझे यह जानने के लिए थोड़ी देर लग गई कि {मिमी, एम, एच, सीसी, सी} भाग उद्धरण के अंदर नहीं होना चाहिए। ~ कीथ
इसको आजमाओ:
$ find . -name "*.txt" -type f -print | xargs file | grep "foo=" | cut -d: -f1
यहां स्थापित: http://www.unix.com/shell-programming-scripting/42573-search-files-excluding-binary-files.html
इसे देखो @
grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags
उन स्क्रिप्ट्स सभी समस्याएं पूरी नहीं करते हैं ... इसे बेहतर प्रयास करें:
du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n "$1"
यह स्क्रिप्ट बहुत बेहतर है, क्योंकि यह खोज से निर्देशिका से बचने के लिए "वास्तविक" नियमित अभिव्यक्तियों का उपयोग करती है। "\ |" के साथ बस अलग फ़ोल्डर या फ़ाइल नाम grep -v पर
इसका आनंद लें! मेरे लिनक्स खोल पर मिला! एक्सडी
खोल ग्लोबिंग सिंटैक्स का प्रयोग करें:
grep pattern -r --include=\*.{cpp,h} rootdir
- --exclude
लिए वाक्यविन्यास समान है।
ध्यान दें कि स्टार को बैकस्लैश से बचने के लिए इसे खोलने से रोकने के लिए भाग लिया गया है (इसे उद्धृत करना, जैसे- --include="*.{cpp,h}"
, ठीक उसी तरह काम करेगा)। अन्यथा, अगर आपके पास मौजूदा कार्यशील निर्देशिका में कोई भी फाइल थी जो पैटर्न से मेल खाती है, तो कमांड लाइन grep pattern -r --include=foo.cpp --include=bar.h rootdir
जैसे कुछ तक विस्तारित होगी, जो केवल फाइलों को grep pattern -r --include=foo.cpp --include=bar.h rootdir
foo.cpp
और bar.h
नाम दिया गया है, जो कि आप जो चाहते थे वह काफी संभव नहीं है।
जीएनयू grep
लिए --binary-files=without-match
विकल्प यह बाइनरी फ़ाइलों को छोड़ने के लिए मिलता है। (आई-स्विच के बराबर कहीं और उल्लेख किया गया।)
(इसके लिए grep
हाल के संस्करण की आवश्यकता हो सकती है; 2.5.3 में कम से कम है।)
मुझे कभी-कभी बहुत उपयोगी होने के लिए grep के आउटपुट grepping मिलते हैं:
grep -rn "foo=" . | grep -v "Binary file"
हालांकि, यह वास्तव में बाइनरी फ़ाइलों को खोजने से नहीं रोकता है।
मैं एक डिलीटेंट हूं, दी गई है, लेकिन यहां बताया गया है कि मेरा ~ / .bash_profile कैसे दिखता है:
export GREP_OPTIONS="-orl --exclude-dir=.svn --exclude-dir=.cache --color=auto" GREP_COLOR='1;32'
ध्यान दें कि दो निर्देशिकाओं को बाहर करने के लिए, मुझे - exclude-dir का दो बार उपयोग करना पड़ा।
यदि आप find
का उपयोग find
विपरीत नहीं find
, तो मुझे इसकी -prune
सुविधा पसंद है:
find [directory] \ -name "pattern_to_exclude" -prune \ -o -name "another_pattern_to_exclude" -prune \ -o -name "pattern_to_INCLUDE" -print0 \ | xargs -0 -I FILENAME grep -IR "pattern" FILENAME
पहली पंक्ति पर, आप उस निर्देशिका को निर्दिष्ट करते हैं जिसे आप खोजना चाहते हैं। .
(वर्तमान निर्देशिका) उदाहरण के लिए एक वैध पथ है।
दूसरी और तीसरी पंक्तियों पर, "*.png"
, "*.gif"
, "*.jpg"
, और बहुत आगे का उपयोग करें। इन -o -name "..." -prune
संरचनाओं के रूप में उपयोग करें क्योंकि आपके पास पैटर्न हैं।
चौथी पंक्ति पर, आपको एक और की आवश्यकता है (यह "या" find
लिए "निर्दिष्ट करता है, जो पैटर्न आप चाहते हैं, और आपको इसके अंत में एक -print
या -print0
की आवश्यकता है। यदि आप बस "सबकुछ" चाहते हैं जो *.gif
, *.png
, आदि छवियों को छंटनी के बाद बनी हुई है, तो -o -print0
उपयोग करें और आप चौथी पंक्ति के साथ कर रहे हैं।
आखिरकार, 5 वीं लाइन पर पाइप xargs
जो उन परिणामी फ़ाइलों में से प्रत्येक लेता है और उन्हें एक चर FILENAME
में संग्रहीत करता है। इसके बाद यह grep
को -IR
झंडे, "pattern"
, और उसके बाद FILENAME
को xargs
द्वारा विस्तारित फ़ाइल नामों की सूची बनने के लिए विस्तारित किया जाता है।
आपके विशेष प्रश्न के लिए, कथन कुछ ऐसा दिख सकता है:
find . \ -name "*.png" -prune \ -o -name "*.gif" -prune \ -o -name "*.svn" -prune \ -o -print0 | xargs -0 -I FILES grep -IR "foo=" FILES
यदि आप गैर-पुनरावर्ती रूप से खोज करते हैं तो आप फ़ाइल नामों से मेल खाने के लिए ग्लोप पैटर्न का उपयोग कर सकते हैं।
grep "foo" *.{html,txt}
एचटीएमएल और txt शामिल हैं। यह केवल वर्तमान निर्देशिका में खोज करता है।
उपनिर्देशिका में खोजने के लिए:
grep "foo" */*.{html,txt}
Subsubdirectories में:
grep "foo" */*/*.{html,txt}
सुझाए गए आदेश:
grep -Ir --exclude="*\.svn*" "pattern" *
अवधारणात्मक रूप से गलत है, क्योंकि - बेसनाम पर कार्यों को शामिल करें। दूसरे शब्दों में रखो, यह केवल वर्तमान निर्देशिका में .svn छोड़ देगा।