कुछ विशिष्ट निर्देशिका के तहत "खोजें" का उपयोग करें?


46

मैं सोच रहा था कि कुछ निर्देशिका के लिए "खोजें" की खोज सीमा को कैसे प्रतिबंधित किया जाए?

उदाहरण के लिए, कुछ निर्देशिकाओं "/ घर / टिम / विज्ञान /" के तहत उनके नाम में स्ट्रिंग "गणित" के साथ फाइलें / निर्देशिका कैसे खोजें?

धन्यवाद एवं शुभकामनाएँ!

जवाबों:


30

अद्यतन : पता लगाने के आर्गन के संबंध में शेल के फ़ाइल नाम के विस्तार के साथ पता लगाने के regex विकल्प का उपयोग करने के बारे में एक नोट ...

SHELL FILENAME का विस्तार
जब आप लिखते हैं locate /bin/b*(ध्यान दें कि कोई उद्धरण नहीं है), तो कई चीजें होती हैं।

  1. सबसे पहले, शेल फाइलनेम-एक्सपेंशन विशेष शेल पैटर्न करेक्टर * का विस्तार करेगा (इसका कारण यह है कि * असुरक्षित है, अर्थात। "डबल-कोट्स" नहीं हैं)
  2. यह परिणामी विस्तार फ़ाइलनामों की एक सूची है । जो शायद बहुत लंबा है ... इस सूची locateको कई अलग-अलग कमांडलाइन आर्ग के रूप में पारित किया गया है।
  3. locate फिर इनमें से प्रत्येक args को इसके डेटाबेस की प्रत्येक फाइल के खिलाफ टेस्ट करता है, और आउटपुट मैच करता है।

हालाँकि ध्यान दें, कि 'पता' में वर्तमान कार्यशील निर्देशिका की कोई अवधारणा नहीं है। यह केवल अपने डेटाबेस में पूरी तरह से योग्य फ़ाइल-नामों के खिलाफ आपके args से मेल खाता है।
इसका मतलब यह है कि यह दोनों से मेल खाएगा /bin/bash और /home/user/bin/brackets
आपके पास इस तरह से कुछ हद तक नियंत्रण है, लेकिन फिर से खोजें के रेगेक्स खोज अधिक प्रदान करता है; जैसा कि पता लगाने के कुछ अन्य विकल्प हैं।

LOCATE'S REGEX OPTION
जब आप locate -r "/bin/b.*"अलग-अलग चीजें टाइप करते हैं तो सिंपल आर्ग्स के साथ होता है .. ( शेल-एक्सटेंडेड-आर्ग्स सिंपल एर्ग्स की लिस्ट है)

  1. -rविकल्प बताता है का पता लगाने एक regex पैटर्न के रूप में अपने आर्ग के इलाज के लिए।
  2. उद्धरण चिह्न शेल फ़ाइल नाम-विस्तार से * की रक्षा करते हैं। इसका मतलब है कि * और डॉट। अब विशेष रेगेक्स वर्ण हैं
  3. Regex होने के नाते, आप बहुत आसानी से विभिन्न तरीकों से इसके डेटाबेस प्रविष्टि से मेल करने के लिए 'पता' बता सकते हैं: eg1। / बिन / बी केlocate -r "^/bin/b.*" साथ शुरू होने वाले फ़ाइल नाम ... eg2। फ़ाइल नाम के साथ / घर / उपयोगकर्ता / बिन / बी शुरू होता है .. ध्यान दें कि ~ / "उद्धरण चिह्नों" द्वारा संरक्षित नहीं है और इसलिए शेल टिल्ड-विस्तार के अधीन है जो ~ / में / घर / उपयोगकर्ता / में परिवर्तित होता है locate -r ~/"bin/b.*"

सारांश: "शेल फाइलनाम विस्तार" 'रेगेक्स' के लिए काफी अलग है

अब वापस मूल पोस्ट पर आते हैं:


locate आम तौर पर पूरे डेटाबेस को स्टडआउट करने के लिए सूचीबद्ध करता है, इसलिए इसे एक विशेष निर्देशिका तक सीमित करने के लिए जिसे आपको इसे फ़िल्टर करने की आवश्यकता है ... आप यह पता लगाने के विकल्पों के माध्यम से कर सकते हैं।

आप केवल शेल-ग्लोबिंग के बजाय ... ( locate /dir/myfile* शेल-ग्लोबिंग) ...

से जानकारी का पता लगाने : -r,--regex

  • "... (regex) मैच पूरे पथ के नाम के खिलाफ किए जाते हैं, और इसलिए डिफ़ॉल्ट रूप से एक pathname का मिलान किया जाएगा यदि इसका कोई भी हिस्सा निर्दिष्ट नियमित अभिव्यक्ति से मेल खाता है। नियमित अभिव्यक्ति ^ पर $ या मैच का लंगर डालने के लिए उपयोग कर सकता है । एक पाथनाम की शुरुआत या अंत। "

नोट: -i = मामले को अनदेखा करें
। । । । । -आर = रेगेक्स
। । । । । ~ / शेल / होम / उपयोगकर्ता (जब ~ / उद्धरण में नहीं है) द्वारा विस्तारित किया जाएगा
। । । । । '\' (बास्कलैश + स्पेस; कोई उद्धरण नहीं) एक शाब्दिक स्थान है (शेल विस्तार से बचने के लिए)। आप स्ट्रिंग को उद्धरणों में रख सकते हैं, लेकिन ~ / उद्धरण के बाहर छोड़ना सुनिश्चित करें: ~/my\ regexया-/"my regex"

जैसे। locate -ir ~/".*"la\ bella\ vitaके रूप में ही है locate -ir ~/".*la bella vita"और कहीं भी होने वाली "ला ​​बेला वीटा" के लिए अपने पूरे घर निर्देशिका खोज करेंगे।

आप खोज को केवल फ़ाइल नाम तक सीमित कर सकते हैं लेकिन -bया का उपयोग करके --basename.. जिस स्थिति में regex start-of-line ^केवल बेसनेम पर लागू होती है ...

मैं आमतौर पर खुद का उपयोग कर पाता हूं locate -bir

PS .. Locateइतनी तेज है, कि मैंने कभी इस्तेमाल नहीं किया है find... और न ही मैंने नॉटिलस सर्च का इस्तेमाल किया है (बहुत धीमी गति से)

'डिटेक्ट' के साथ, यदि आप किसी ऐसी चीज की तलाश कर रहे हैं, जो नई जोड़ी गई है, तो बस sudo updatedbडिटेक्ट के डेटाबेस को रिफ्रेश करने के लिए चलाएं ... (लेकिन अगर आपने इसे नया जोड़ा है, तो आप शायद जानते हैं कि यह कहां है:) ...।


13

इसे इस तरह से grep के माध्यम से पाइप करें

$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless

संपादित करें: अन्य उत्तर बेहतर है, मुझे नहीं पता था कि आप पता लगाने के लिए एक पैटर्न पास कर सकते हैं।


@ अदम .. अपने तरीके को कम मत समझना; यह काफी ठीक है, लेकिन आप grep को पाइप करने के बजाय डिटेक्ट के अपने रेगेक्स का उपयोग कर सकते हैं .. "अन्य" विधि जिसे आप रेगेक्स का उपयोग नहीं करते हैं और काफी भिन्न व्यवहार करते हैं .... मैंने अपने अंतर के बारे में कुछ विवरण जोड़ा है। उत्तर ...
20.O पर पीटर।

2
कम खोजें | grep ^ / bin का पता लगाने -r ^ / bin /.* की तुलना में अधिक तेज़ है, क्योंकि कम का पता लगाने से कम शब्द के लिए एक कुशल खोज होगी, और पता लगाने के लिए -r स्थित में सभी प्रविष्टियों पर एक regex ऑपरेशन करेगा
Marcel

@MarcelValdezOrozco "शब्द की कुशल खोज" क्या है और यह रेगेक्स से अधिक तेज़ क्यों है?
फ्लैशरनर

@Flashrunner क्योंकि जब आप इसे एक गैर-रेगेक्स खोज क्वेरी देते हैं, तो locateएक O(log(n))खोज खत्म हो locatedbजाती है, तो आप पहले से ही कम किए गए उप-परिणामों पर खोज grepकरने के लिए regex का उपयोग कर सकते हैं O(m)। (n में कुल प्रविष्टियों की संख्या locatedb[अर्थात आपकी ड्राइव की सभी फाइलें], मी = # प्रविष्टियों की संख्या जो आपके में कम मेल खाती हैं locatedb), कुल चल जटिलता: O(log(n)) + O(m)जहां एम औसतन है log(n), इसलिए आप प्रदर्शन करते समय 2*O(log(n))विरोध O(n)करते हैं। सभी प्रविष्टियों पर एक regex क्वेरी locatedb
मार्सेल वाल्डेज़ ओरोज़्को

@MarcelValdezOrozco लेकिन डीबी पर गैर-रेगेक्स खोज क्यों है O(log(n))जबकि रेगेक्स खोज है O(n)? Db में प्रविष्टियों की मात्रा प्रत्येक मामले में समान है। मुझे लगता है कि यह खोज एल्गोरिथ्म है?
फ्लैशरनर

8

आप उपयोग कर सकते हैं। locate /rootpath/*filenamespecमैंने पहले इसकी कोशिश नहीं की थी, लेकिन यह काम करने लगता है। अपने उदाहरण के लिए, यह होगाlocate /home/tim/science/*math*

आप उस तरह के व्यवहार के findबजाय कमांड को देखना चाहते locateहैं। वाक्य-विन्यास होगा find rootforsearch -name filenamepattern -print। इस स्थिति में, आपके उदाहरण की आवश्यकता होगी। find /home/tim/science -name *math* -printक्योंकि जितनी जल्दी खोज करने के लिए कोई डेटाबेस नहीं है उतना तेजी से खोजें ... यह वास्तव में फाइल सिस्टम को खोजता है। बहुत सारे विकल्प हैं जो आप प्रिंट के अलावा अन्य उपयोग कर सकते हैं, यदि आप वास्तव में फ़ाइल के साथ कुछ करने का इरादा रखते हैं।


यह सबसे अच्छा जवाब है क्योंकि यह locateस्वयं का उपयोग करता है (जैसे किसी भी अन्य उपयोगिता की आवश्यकता नहीं है grep) और रेगेक्स के बिना करता है (जो इस मामले में अच्छा है, लेकिन अनावश्यक है)।
टॉम

यह वास्तव में एक आकर्षण की तरह काम करता है जिसे आप विशिष्ट निर्देशिका पथ में खोज फ़ाइलों का पता लगाने के लिए उपयोग कर सकते हैं, धन्यवाद @Nerdfest
amit_game

1

मेरे लिए सबसे सुविधाजनक है

cd /home/tim/science
locate math | grep `pwd`

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