"खोजने" और "खोजने" के लिए तेजी से विकल्प?


22

मैं अपनी परियोजना में स्रोत फ़ाइलों की खोज करने के लिए "ढूंढना" और "उपयोग करना" पसंद करूंगा, लेकिन उन्हें चलाने में लंबा समय लगता है। क्या इन कार्यक्रमों के लिए मुझे तेजी से विकल्प मिलते हैं, या प्रदर्शन को तेज करने के तरीके नहीं हैं। इन कार्यक्रमों के?


2
locateपहले से ही काफी तेज होना चाहिए, यह देखते हुए कि यह एक पूर्व-निर्मित सूचकांक (प्राथमिक कैविट का उपयोग किया जा रहा है जिसे इसे अद्यतित रखने की आवश्यकता है), जबकि findनिर्देशिका लिस्टिंग को पढ़ना होगा।
afrazier

2
आप कौन सा पता लगा रहे हैं? mlocate लंबे समय तक धीमे से तेज़ होता है (ध्यान दें कि आपने जो भी पैकेज स्थापित किया है, कमांड अभी भी है, इसलिए अपने पैकेज मैनेजर की जांच करें)
Paul

@benhsu, जब मैं find /usr/src -name fprintf.cअपने OpenBSD डेस्कटॉप मशीन पर चलता हूं, तो यह 10 सेकंड से भी कम समय में उन स्रोत फ़ाइलों के स्थान लौटा देता है। locate fprintf.c | grep '^/usr/src.*/fprintf.c$'एक सेकंड के अंदर वापस आता है। "लंबे समय तक चलने" की आपकी परिभाषा क्या है और आप कैसे उपयोग करते हैं findऔर locate?
कुसलानंद

@Paul, मैं mlocate का उपयोग कर रहा हूँ।
बेन्हसु

@KAK, मैं emacs में फ़ाइल खोलने के लिए / खोज के आउटपुट का उपयोग करना चाहूंगा। मेरे पास जो उपयोग मामला है वह यह है कि, मैं फ़ाइल को संपादित करना चाहता हूं, मैं फ़ाइल का नाम टाइप करता हूं (या कुछ regexp फ़ाइल नाम से मेल खाता है) emacs में, और emacs इसे मिलाने वाली फ़ाइलों की सूची लाने के लिए खोज / पता का उपयोग करेंगे, इसलिए मैं प्रतिक्रिया समय को तेजी से इंटरैक्टिव (1 सेकंड से कम) होना पसंद करूंगा। मेरे पास $ HOME में लगभग 3 मिलियन फाइलें हैं, एक चीज जो मैं कर सकता हूं वह है मेरे फाइंड कमांड को कुछ फाइलों से बाहर निकालना।
बेन्हसु

जवाबों:


16

किसी प्रोजेक्ट में स्रोत फ़ाइलों की खोज करना

एक सरल कमांड का उपयोग करें

आम तौर पर, एक परियोजना के लिए स्रोत एक ही स्थान पर होने की संभावना है, शायद कुछ उपनिर्देशिकाओं में दो या तीन से अधिक गहरी घोंसले नहीं होते हैं, इसलिए आप एक (संभवतः) तेज कमांड का उपयोग कर सकते हैं जैसे

(cd /path/to/project; ls *.c */*.c */*/*.c)

परियोजना मेटाडेटा का उपयोग करें

एक सी परियोजना में आप आम तौर पर एक मेकफाइल होगा। अन्य परियोजनाओं में आपके पास कुछ समान हो सकता है। ये फाइलों की एक सूची निकालने का एक तेज़ तरीका हो सकता है (और उनके स्थान) एक स्क्रिप्ट लिखता है जो फ़ाइलों का पता लगाने के लिए इस जानकारी का उपयोग करता है। मेरे पास एक "स्रोत" स्क्रिप्ट है, ताकि मैं जैसे कमांड लिख सकूं grep variable $(sources programname)

तेजी से खोज

जहाँ संभव हो , find / …उपयोग के बजाय कम स्थान खोजें find /path/to/project …। जितना संभव हो चयन मानदंडों को सरल बनाएं। अधिक कुशल होने पर कुछ चयन मानदंडों को टालने के लिए पाइपलाइनों का उपयोग करें।

इसके अलावा, आप खोज की गहराई को सीमित कर सकते हैं। मेरे लिए, यह 'खोजने' की गति को बहुत सुधारता है। आप -maxdepth स्विच का उपयोग कर सकते हैं। उदाहरण के लिए '-Maxdepth 5'

गति का पता लगाना

सुनिश्चित करें कि यह उन स्थानों को अनुक्रमित कर रहा है, जिनमें आप रुचि रखते हैं। मैन पेज पढ़ें और अपने कार्य के लिए जो भी विकल्प उपयुक्त हों, उसका उपयोग करें।

   -U <dir>
          Create slocate database starting at path <dir>.

   -d <path>
          --database=<path> Specifies the path of databases to search  in.


   -l <level>
          Security  level.   0  turns  security checks off. This will make
          searchs faster.   1  turns  security  checks  on.  This  is  the
          default.

खोज की आवश्यकता को निकालें

शायद आप खोज रहे हैं क्योंकि आप भूल गए हैं कि कुछ कहाँ है या नहीं बताया गया है। पूर्व मामले में, उत्तर में नोट्स (प्रलेखन) लिखें, पूछें? सम्मेलनों, मानकों और स्थिरता से बहुत मदद मिल सकती है।


10

मैंने RedGrittyBrick के उत्तर के "तेज पता लगाने" वाले हिस्से का उपयोग किया। मैंने एक छोटा db बनाया:

updatedb -o /home/benhsu/ben.db -U /home/benhsu/ -e "uninteresting/directory1 uninteresting/directory2"

फिर उस पर इशारा locateकिया:locate -d /home/benhsu/ben.db


6

एक युक्ति जो मैं उपयोग करता हूं वह -maxdepthविकल्प के साथ लागू होती है find:

find -maxdepth 1 -iname "*target*"

बढ़ती गहराई के साथ दोहराएं जब तक आप पाते हैं कि आप क्या देख रहे हैं, या आप देख कर थक गए हैं। पहले कुछ पुनरावृत्तियों के तुरंत लौटने की संभावना है।

यह सुनिश्चित करता है कि जब आप जिस चीज़ की तलाश कर रहे हैं उसकी गहराई तक पहुँचने के दौरान आप सामने के समय को बर्बाद न करें जब आप देख रहे हैं तो पदानुक्रम के आधार के पास होने की अधिक संभावना है।


इस प्रक्रिया को स्वचालित करने के लिए एक उदाहरण स्क्रिप्ट है (जब आप देखते हैं कि आप क्या चाहते हैं तो Ctrl-C):

(
TARGET="*target*"
for i in $(seq 1 9) ; do
   echo "=== search depth: $i"
   find -mindepth $i -maxdepth $i -iname "$TARGET"
done
echo "=== search depth: 10+"
find -mindepth 10 -iname $TARGET
)

ध्यान दें कि निहित अतिरेक शामिल है (प्रत्येक पास को पिछले पास में संसाधित फ़ोल्डर्स को पीछे हटाना होगा) को डिस्क कैशिंग के माध्यम से दूर किया जाएगा।

findएक अंतर्निहित सुविधा के रूप में यह खोज क्रम क्यों नहीं है? हो सकता है क्योंकि यह जटिल / असंभव होगा कि यदि आप यह मान लें कि निरर्थक ट्रैवर्सल अस्वीकार्य है। -depthविकल्प का अस्तित्व संभावना पर संकेत देता है, लेकिन अफसोस ...


1
... इस प्रकार "चौड़ाई-प्रथम" खोज कर रहे हैं।
नोबार

3

एक और आसान उपाय है नए विस्तारित शेल ग्लोबिंग का उपयोग करना। सक्षम करने के लिए:

  • bash: shops -s ग्लोबस्टार
  • ksh: set -o ग्लोबस्टार
  • zsh: पहले से ही सक्षम

फिर, आप शीर्ष-स्तरीय स्रोत निर्देशिका में इस तरह से कमांड चला सकते हैं:

# grep through all c files
grep printf **/*.c

# grep through all files
grep printf ** 2>/dev/null

इसका यह लाभ है कि यह सभी उपनिर्देशिकाओं के माध्यम से पुनरावर्ती खोज करता है और बहुत तेज है।


3

द सिल्वर सर्चर

स्रोत कोड फ़ाइलों की एक बड़ी संख्या की सामग्री को बहुत तेज़ी से खोजने के लिए आपको यह उपयोगी लग सकता है । बस टाइप करें ag <keyword>। यहाँ मेरे कुछ उत्पादन apt show silversearcher-ag:

मैं आमतौर पर इसका उपयोग करता हूं:

-G --file-search-regex PATTERN केवल उन फ़ाइलों को खोजें जिनके नाम PATTERN से मेल खाते हैं।

ag -G "css$" important

स्क्रीनशॉट


1
ripgrep के algorythm कथित तौर पर तेजी से silversearch से है, और यह भी सम्मानित करता है .gitignoreफ़ाइलें और छोड़ने .git, .svn, .hg.. फ़ोल्डरों।
ccpizza

@ccpizza तो? सिल्वर सर्चर.gitignore डिफ़ॉल्ट रूप से छिपी और बाइनरी फाइलों को सम्मानित और अनदेखा भी करता है । इसके अलावा अधिक योगदानकर्ता हैं, जीथब पर अधिक सितारे (14700 बनाम 8300) और पहले से ही मेयर डिस्ट्रोस के भंडार पर है। कृपया एक अद्यतन विश्वसनीय तृतीय-पक्ष स्रोत तुलना प्रदान करें। बहरहाल, ripgrepसॉफ्टवेयर का एक बड़ा टुकड़ा दिखता है।
पाब्लो ए

जानकार अच्छा लगा! मैं लेखक (ओं) के ripgrepसाथ किसी भी तरह से संबद्ध नहीं हूं , यह सिर्फ मेरी आवश्यकता के अनुरूप है इसलिए मैंने अन्य विकल्पों की खोज बंद कर दी।
ccpizza

रजत खोजकर्ता .gitignoreभी सम्मान करता है। यह कहा, rgबिल्कुल अद्भुत है। सबसे पहले, इसमें यूनिकोड समर्थन है। मेरे अनुभव rgमें कम से कम दो बार ag(YMMV) के रूप में उपवास के रूप में , मुझे लगता है कि यह रस्ट के रेगेक्स पार्सर के कारण है, जाहिर है कि अभी तक वापस तैयार नहीं हुआ agथा नए साल में। rgनियतात्मक आउटपुट दे सकते हैं (लेकिन डिफ़ॉल्ट रूप से नहीं), यह फ़ाइल प्रकारों को ब्लैकलिस्ट agकर सकता है जहां केवल श्वेतसूची हो सकती है, यह आकार (बाय बाय लॉग्स) के आधार पर फ़ाइलों को अनदेखा कर सकता है। मैं अभी भी agमामले में उपयोग करता हूं मुझे बहु-मिलान मिलान की आवश्यकता होती है, जो rgनहीं कर सकता।
पेलमिस्टर

2

खोज प्रतिस्थापन के लिए, fd देखें । इसमें मूल खोज कमांड की तुलना में सरल / अधिक सहज ज्ञान युक्त इंटरफ़ेस है, और यह काफी तेज है।

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