vs vs find: एक दूसरे का उपयोग, पेशेवरों और विपक्ष


132

लिनक्स और यूनिक्स प्रणालियों में दो सामान्य खोज कमांड हैं: locateऔर find

प्रत्येक का भला - बुरा क्या है? जब एक दूसरे पर लाभ होता है?


6
उदाहरण के लिए देखें superuser.com/questions/199472/…
jofel

जवाबों:


166

locate(1)केवल एक बड़ा फायदा है find(1): गति।

find(1)हालाँकि, इसके कई फायदे हैं locate(1):

  • find(1)प्राइमर्डियल है, एटी एंड टी यूनिक्स के पहले संस्करण में वापस जा रहा है । आप इसे व्यस्त बॉक्स के माध्यम से कट-डाउन एम्बेडेड लिनक्स में भी पाएंगे । यह सर्वव्यापी है।

    locate(1)से बहुत छोटा है find(1)locate(1) 1983 तक का सबसे पहला पूर्वज दिखाई नहीं दिया , और यह locate1994 तक व्यापक रूप से " " के रूप में उपलब्ध नहीं था , जब इसे GNU खोज में और 4.4BSD में अपनाया गया था ।

  • locate(1)यह भी गैरमानक है , इस प्रकार यह डिफ़ॉल्ट रूप से हर जगह स्थापित नहीं है। कुछ POSIX प्रकार के OSes भी इसे एक विकल्प के रूप में पेश नहीं करते हैं, और जहां यह उपलब्ध है, कार्यान्वयन में उन सुविधाओं की कमी हो सकती है जो आप चाहते हैं क्योंकि न्यूनतम सुविधा सेट निर्दिष्ट करने के लिए कोई स्वतंत्र मानक नहीं है जो उपलब्ध होना चाहिए।

    वहाँ एक है वास्तविक मानक, किया जा रहा है बीएसडीlocate(1) , लेकिन वह यह है कि सिर्फ इसलिए कि अन्य दो प्रमुख स्वाद locateअपने सभी विकल्पों को लागू: -0, -c, -d, -i, -l, -m, -s, और -Smlocateबीएसडी में 6 अतिरिक्त विकल्पों को लागू करता है नहीं locate: -b, -e, -P, -q, --regexऔर -wजीएनयूlocate उन छह प्लस एक और लागू करता है चार : -A, -D, -E, और -p। (मैं -?बनाम -hबनाम उपनाम और मामूली अंतरों की अनदेखी कर रहा हूं --help।)

    बीएसडी और मैक ओएस एक्स जहाज बीएसडी locate

    अधिकांश लिनक्स जीएनयू को जहाज करते हैं locate, लेकिन mlocateइसके बजाय रेड हैट लिनक्स और आर्क जहाज । डेबियन अपने बेस इंस्टॉल में या तो स्थापित नहीं करता है, लेकिन अपने डिफ़ॉल्ट पैकेज रिपॉजिटरी में दोनों संस्करण प्रदान करता है; यदि दोनों को एक साथ स्थापित किया जाता है, तो " locate" चलता है mlocate

    दिसंबर 2014 में जारी 11.2 के बाद से ओरेकल mlocateसोलारिस में शिपिंग हो गया है । इससे पहले, सोलारिस पर डिफ़ॉल्ट रूप से स्थापित नहीं किया गया था। (संभवतः, यह ओरेकल लिनक्स के साथ सोलारिस के कमांड असंगतता को कम करने के लिए किया गया था , जो कि Red Hat Enterprise Linux पर आधारित है , जो इसका उपयोग भी करता है ।)locatemlocate

    आईबीएम एआईएक्स अभी भी किसी भी संस्करण को जहाज नहीं करता है locate, कम से कम एआईएक्स 7.2 के रूप में , जब तक कि आप लिनक्स एप्लिकेशन के लिए एआईएक्स टूलबॉक्सfindutils से जीएनयू स्थापित न करें ।

    HP-UX भी प्रतीत होता है की कमी करने के लिए locateआधार प्रणाली में।

    पुराने "वास्तविक" यूनिक्स में आम तौर पर एक कार्यान्वयन शामिल नहीं था locate

  • find(1)कई कार्यों, बूलियन ऑपरेटरों , आदि के साथ एक शक्तिशाली अभिव्यक्ति वाक्यविन्यास है ।

  • find(1)केवल नाम से अधिक फ़ाइलों का चयन कर सकते हैं। इसके द्वारा चयन कर सकते हैं:

    • आयु
    • आकार
    • मालिक
    • फाइल का प्रकार
    • टाइमस्टैम्प
    • अनुमतियाँ
    • उपशीर्षक के भीतर गहराई ...
  • नाम से फाइलें ढूंढते समय, आप नियमित अभिव्यक्तियों का उपयोग करते हुए या GNU या BSD संस्करणों के सभी संस्करणों में फ़ाइल ग्लोबिंग सिंटैक्स का उपयोग करके खोज कर सकते हैं ।find(1)

    वर्तमान में locate(1)स्वीकार किए जाते हैं के रूप में ग्लोब पैटर्न के संस्करणों find, लेकिन BSD locateregexes बिल्कुल नहीं करता है। यदि आप मेरे जैसे हैं और आपको कई प्रकार की मशीन का उपयोग करना है, तो आप अपने आप को grepफ़िल्टर करना पसंद करते हैं, जिस पर निर्भरता विकसित करना -rया --regex

    locateजरूरत से ज्यादा मजबूत छानने की जरूरत findहै क्योंकि ...

  • find(1)जरूरी नहीं कि पूरा फाइल सिस्टम खोजे। आप इसे आम तौर पर एक उपनिर्देशिका में इंगित करते हैं, एक माता-पिता जिसमें वे सभी फाइलें हैं जिन्हें आप इसे संचालित करना चाहते हैं। एक locate(1)कार्यान्वयन के लिए विशिष्ट व्यवहार आपके पैटर्न से मेल खाती सभी फ़ाइलों को उगलने के लिए है, इसे grepफ़िल्टर करने के लिए छोड़ दिया जाता है और इस तरह इसका विस्फोट आकार में कटौती करता है।

    (बुराई टिप: locate /शायद आपको सिस्टम की सभी फाइलों की सूची मिल जाएगी!)

    उपयोगकर्ता के अनुमतियों के आधार पर आउटपुट को प्रतिबंधित करने वाले वेरिएंट locate(1)जैसे हैं slocate(1), लेकिन यह locateकिसी भी बड़े ऑपरेटिंग सिस्टम का डिफ़ॉल्ट संस्करण नहीं है।

  • find(1)फ़ाइलों को खोजने के लिए यह कर सकते हैं , बस उन्हें खोजने के अलावा। इस तरह के ऑपरेटर सबसे शक्तिशाली और व्यापक रूप से समर्थित हैं -exec, लेकिन अन्य हैं। हाल ही में जीएनयू और बीएसडी में कार्यान्वयन लगता है, उदाहरण के लिए, आपके पास -deleteऔर -execdirऑपरेटरों।

  • find(1) वास्तविक समय में चलता है, इसलिए इसका आउटपुट हमेशा अपडेट रहता है।

    क्योंकि locate(1)अतीत में घंटों या दिनों के अपडेट किए गए डेटाबेस पर निर्भर करता है, इसका आउटपुट पुराना हो सकता है। (यह बासी कैश की समस्या है ।) इस सिक्के के दो पहलू हैं:

    1. locate उन फ़ाइलों को नाम दे सकता है जो अब मौजूद नहीं हैं।

      जीएनयू locateऔर mlocateहै -eझंडा यह फ़ाइल होने की जाँच करने के लिए नाम को प्रिंट से प्रत्येक फाइल यह अतीत में की खोज की पहले, लेकिन इस में से कुछ खा locateगति लाभ, और नहीं बीएसडी में उपलब्ध है locateके अलावा।

    2. locate पिछले डेटाबेस अद्यतन के बाद बनाई गई फ़ाइलों को नाम देने में विफल रहेगा।

    आप locateआउटपुट के बारे में कुछ अविश्वास करना सीखते हैं , यह जानना गलत हो सकता है।

    इस समस्या को हल करने के तरीके हैं, लेकिन मुझे व्यापक उपयोग में किसी भी कार्यान्वयन के बारे में पता नहीं है। उदाहरण के लिए, वहाँ है rlocate, लेकिन यह प्रतीत होता है किसी भी आधुनिक लिनक्स कर्नेल के खिलाफ काम नहीं करने के लिए।

  • find(1) उपयोगकर्ता के पास इसे चलाने से अधिक विशेषाधिकार कभी नहीं है।

    क्योंकि locateएक सिस्टम पर सभी उपयोगकर्ताओं के लिए एक वैश्विक सेवा प्रदान करता है, यह अपनी updatedbप्रक्रिया को चलाना चाहता है rootताकि यह पूरे फाइल सिस्टम को देख सके। यह सुरक्षा समस्याओं का एक विकल्प है:

    1. updatedbरूट के रूप में चलाएं , लेकिन इसकी आउटपुट फ़ाइल को विश्व-पठनीय बनाएं ताकि locateविशेष विशेषाधिकार के बिना चल सकें । यह प्रभावी रूप से सभी उपयोगकर्ताओं के लिए सिस्टम की सभी फाइलों के नामों को उजागर करता है। यह वास्तविक समस्या पैदा करने के लिए सुरक्षा उल्लंघन के लिए पर्याप्त हो सकता है।

      बीएसडी locateमैक ओएस एक्स और फ्रीबीएसडी पर इस तरह से कॉन्फ़िगर किया गया है।

    2. डेटाबेस को केवल पढ़ने योग्य के रूप में लिखें root, और locate setuidरूट बनाएं ताकि यह डेटाबेस को पढ़ सके। इसका मतलब यह है कि locateप्रभावी रूप से ओएस की अनुमति प्रणाली को फिर से लागू करना है ताकि यह आपको ऐसी फाइलें न दिखाए जो आप सामान्य रूप से नहीं देख सकते हैं। यह आपके सिस्टम की हमले की सतह को भी बढ़ाता है, विशेष रूप से रूट एस्केलेशन हमले को जोखिम में डालकर ।

    3. locateडेटाबेस फ़ाइल के मालिक के लिए एक विशेष " " उपयोगकर्ता या समूह बनाएँ, और उस उपयोगकर्ता / समूह के लिए locateबाइनरी को चिह्नित करें setuid/setgidताकि यह डेटाबेस पढ़ सके। यह अपने आप में विशेषाधिकार वृद्धि के हमलों को नहीं रोकता है, लेकिन यह उस क्षति को बहुत कम कर देता है जिससे कोई नुकसान हो सकता है।

      mlocateRed Hat Enterprise Linux पर इस तरह विन्यस्त है ।

      हालाँकि, आपको अभी भी एक समस्या है, क्योंकि यदि आप डिबगर का उपयोग कर सकते हैं locateया इसे डंप कोर पर ले जा सकते हैं, तो आप डेटाबेस के विशेषाधिकार प्राप्त भागों पर प्राप्त कर सकते हैं।

    मुझे locateसिस्टम पर प्रत्येक उपयोगकर्ता के लिए इसे अलग से चलाने का एक सही मायने में "सुरक्षित" कमांड बनाने का कोई रास्ता नहीं दिखता है, जो कि इसके अधिक लाभ को नकार देता है find(1)

निचला रेखा, दोनों बहुत उपयोगी हैं। locate(1)बेहतर है जब आप केवल नाम से एक विशेष फ़ाइल खोजने की कोशिश कर रहे हैं, जिसे आप जानते हैं कि मौजूद है, लेकिन आपको अभी याद नहीं है कि यह वास्तव में कहां है। find(1)जब आपके पास जांच करने के लिए एक केंद्रित क्षेत्र हो, या जब आपको इसके कई लाभों में से किसी की आवश्यकता हो तो बेहतर है।


क्षमा करें, मैंने "सुस्त" पैराग्राफ की अनदेखी की। rlocate बासी कैश समस्या को संबोधित करता है । आप खोज के कुछ प्रश्नों का उल्लेख करना चाह सकते हैं, जैसे find -- "$dir" कि मजबूत नहीं ( $dirएक विधेय के लिए लिया जा सकता है), सिम्लिंक, दौड़ की स्थिति के मुद्दों की विशेषताओं का परीक्षण करने का कोई तरीका नहीं ... मेरे लिए findऔर locateदो अलग-अलग समस्याओं का समाधान करना। ऐसी कई जगहें हैं जहां खोज का उपयोग वास्तविक नहीं है (जैसे लाखों फ़ाइलों वाली निर्देशिकाएं)। पता लगाना एक अनुक्रमण प्रणाली है जो फ़ाइल नामों तक सीमित है।
स्टीफन चेजलस

2
पहली बार का कार्यान्वयन locateलगभग कुछ हद तक पसंद आया था find / -type f | gzip > locate.gz, औरzgrep "$1" <locate.gz
F. Hauri

@ एफ.हरि: दिलचस्प सामान्य ज्ञान। यहाँ और भी है: जीएनयू locateमें है findutilsपैकेज है, और अपने updatedbकार्यक्रम के संदर्भ में लागू किया गया है find(1)। तो उस अर्थ में, locate(1)वास्तव में आवश्यकता है find(1) । :)
वॉरेन यंग

1
@ArrenYoung केवल फू के बजाय foo (1) का लगातार संदर्भ क्यों है? क्या फू के विभिन्न संस्करण आदि हैं?
अखरोट के बारे में natty

4
@nuttyaboutnatty: यह यूनिक्स मैनुअल में एक प्राचीन परंपरा, मैनुअल खंड 1. हालांकि यह सच है है कि वहाँ कोई अर्थ है find, locateआदि अन्य वर्गों में है, इसलिए इसे के विभिन्न वर्गों में इस्तेमाल एक ही नाम को स्पष्ट करने के लिए वहाँ हो की जरूरत नहीं है मैनुअल (उदाहरण के लिए unlink(1)बनाम unlink(2)), हम में से जो लोग सम्मेलन में आते थे, वे एक मैन पेज संदर्भ के रूप में देखते थे।
वारेन यंग

35

locateएक प्रीबिल्ट डेटाबेस का उपयोग करता है, जिसे नियमित रूप से अपडेट किया जाना चाहिए, जबकि findफ़ाइलों का पता लगाने के लिए एक फाइल सिस्टम पर पुनरावृत्त होता है।

इस प्रकार, locateकी तुलना में बहुत तेज़ है find, लेकिन गलत हो सकता है अगर डेटाबेस -कैन को कैश के रूप में देखा जाए- अपडेट नहीं किया गया है ( updatedbकमांड देखें )।

इसके अलावा, findअधिक ग्रैन्युलैरिटी की पेशकश कर सकते हैं, जैसा कि आप इसकी प्रत्येक विशेषता से फ़ाइलों को फ़िल्टर कर सकते हैं, जबकि locateफ़ाइल नामों के खिलाफ मिलान किए गए पैटर्न का उपयोग करता है।


7

findमैन पेज के सावधान उपयोग के बिना सफलतापूर्वक यूनिक्स के नौसिखिया या सामयिक उपयोगकर्ता के लिए संभव नहीं है। उपयोगकर्ता-शत्रुता को जोड़कर , ऐतिहासिक रूप से, कुछ संस्करणों findने भी -printविकल्प को डिफ़ॉल्ट नहीं किया ।

locate कम लचीला है, लेकिन आम मामले में उपयोग करने के लिए अधिक सहज है।


1
दूसरी ओर, पता लगाने के लिए एक DB को बनाए रखना है और समय-समय पर चलाना है, इसलिए मैंने इसे अपने निजी नेटवर्क पर रहने वाले सभी लिनक्स सर्वरों पर अक्षम कर दिया है।
रुई एफ रिबेरो

2
इसमें मुश्किल क्या है? find . -name 'nametosearch', या -inameकेस-असंवेदनशील के लिए। .वर्तमान निर्देशिका के अलावा अन्य खोज करने के लिए निर्देशिका पथ के साथ बदलें । वहाँ, कि एक नौसिखिया उपयोगकर्ता की आवश्यकताओं का 90% भी फ़ाइल ग्लोबिंग में शामिल किए बिना कवर किया गया है। (मैं आमतौर पर उपयोग करता find . -iname '*partialfilename*'हूं और यदि मैं खोज रहा हूं /, तो मैं उपयोग find / -maxdepth 5 -iname '*partialname*'करता हूं जो खोज समय में कटौती करता है, जबकि 90% समय में जो कुछ भी मैं चाहता हूं वह सब कुछ
ढूंढता है

2

पता लगाने की थोड़ी सी कमी यह है कि यह उस फ़ाइल सिस्टम के क्षेत्र को अनुक्रमणित नहीं कर सकता है जिसमें आप रुचि रखते हैं। डेबियन डेस्कटॉप सिस्टम पर, उदाहरण के लिए लिनक्स मिंट 17.2, /etc/updatedb.conf फ़ाइल को कुछ क्षेत्रों को विचार से बाहर करने के लिए कॉन्फ़िगर किया गया है। , सहित / tmp, / var / स्पूल, और /home/.ecryptfs।

/Home/.ecryptfs को अनदेखा करने से एन्क्रिप्टेड निर्देशिकाओं में फ़ाइल नामों को अनधिकृत उपयोगकर्ताओं के संपर्क में आने से रोकता है। हालाँकि, यदि आपकी होम डाइरेक्टरी को ecryptfs से एन्क्रिप्ट किया गया है, तो इसका मतलब यह भी है कि आपके होम डाइरेक्टरी को अनुक्रमित नहीं किया गया है, और इसलिए आपके होम डाइरेक्टरी में कभी भी कुछ भी नहीं मिलेगा। यह आपके लिए काफी हद तक बेकार हो सकता है (यह मेरे लिए है)। परिणाम न मिलने के अलावा, अपडेट की गई प्रक्रिया समय-समय पर आपकी डिस्क को बिना किसी लाभ के लोड करेगी, और यदि आप सिस्टम के मुख्य या एकमात्र उपयोगकर्ता हैं, तो यह अक्षम भी हो सकता है।

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