जवाबों:
locate(1)
केवल एक बड़ा फायदा है find(1)
: गति।
find(1)
हालाँकि, इसके कई फायदे हैं locate(1)
:
find(1)
प्राइमर्डियल है, एटी एंड टी यूनिक्स के पहले संस्करण में वापस जा रहा है । आप इसे व्यस्त बॉक्स के माध्यम से कट-डाउन एम्बेडेड लिनक्स में भी पाएंगे । यह सर्वव्यापी है।
locate(1)
से बहुत छोटा है find(1)
। locate(1)
1983 तक का सबसे पहला पूर्वज दिखाई नहीं दिया , और यह locate
1994 तक व्यापक रूप से " " के रूप में उपलब्ध नहीं था , जब इसे GNU खोज में और 4.4BSD में अपनाया गया था ।
locate(1)
यह भी गैरमानक है , इस प्रकार यह डिफ़ॉल्ट रूप से हर जगह स्थापित नहीं है। कुछ POSIX प्रकार के OSes भी इसे एक विकल्प के रूप में पेश नहीं करते हैं, और जहां यह उपलब्ध है, कार्यान्वयन में उन सुविधाओं की कमी हो सकती है जो आप चाहते हैं क्योंकि न्यूनतम सुविधा सेट निर्दिष्ट करने के लिए कोई स्वतंत्र मानक नहीं है जो उपलब्ध होना चाहिए।
वहाँ एक है वास्तविक मानक, किया जा रहा है बीएसडीlocate(1)
, लेकिन वह यह है कि सिर्फ इसलिए कि अन्य दो प्रमुख स्वाद locate
अपने सभी विकल्पों को लागू: -0
, -c
, -d
, -i
, -l
, -m
, -s
, और -S
। mlocate
बीएसडी में 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 पर आधारित है , जो इसका उपयोग भी करता है ।)locate
mlocate
आईबीएम एआईएक्स अभी भी किसी भी संस्करण को जहाज नहीं करता है locate
, कम से कम एआईएक्स 7.2 के रूप में , जब तक कि आप लिनक्स एप्लिकेशन के लिए एआईएक्स टूलबॉक्सfindutils
से जीएनयू स्थापित न करें ।
HP-UX भी प्रतीत होता है की कमी करने के लिए locate
आधार प्रणाली में।
पुराने "वास्तविक" यूनिक्स में आम तौर पर एक कार्यान्वयन शामिल नहीं था locate
।
find(1)
कई कार्यों, बूलियन ऑपरेटरों , आदि के साथ एक शक्तिशाली अभिव्यक्ति वाक्यविन्यास है ।
find(1)
केवल नाम से अधिक फ़ाइलों का चयन कर सकते हैं। इसके द्वारा चयन कर सकते हैं:
नाम से फाइलें ढूंढते समय, आप नियमित अभिव्यक्तियों का उपयोग करते हुए या GNU या BSD संस्करणों के सभी संस्करणों में फ़ाइल ग्लोबिंग सिंटैक्स का उपयोग करके खोज कर सकते हैं ।find(1)
वर्तमान में locate(1)
स्वीकार किए जाते हैं के रूप में ग्लोब पैटर्न के संस्करणों find
, लेकिन BSD locate
regexes बिल्कुल नहीं करता है। यदि आप मेरे जैसे हैं और आपको कई प्रकार की मशीन का उपयोग करना है, तो आप अपने आप को 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)
अतीत में घंटों या दिनों के अपडेट किए गए डेटाबेस पर निर्भर करता है, इसका आउटपुट पुराना हो सकता है। (यह बासी कैश की समस्या है ।) इस सिक्के के दो पहलू हैं:
locate
उन फ़ाइलों को नाम दे सकता है जो अब मौजूद नहीं हैं।
जीएनयू locate
और mlocate
है -e
झंडा यह फ़ाइल होने की जाँच करने के लिए नाम को प्रिंट से प्रत्येक फाइल यह अतीत में की खोज की पहले, लेकिन इस में से कुछ खा locate
गति लाभ, और नहीं बीएसडी में उपलब्ध है locate
के अलावा।
locate
पिछले डेटाबेस अद्यतन के बाद बनाई गई फ़ाइलों को नाम देने में विफल रहेगा।
आप locate
आउटपुट के बारे में कुछ अविश्वास करना सीखते हैं , यह जानना गलत हो सकता है।
इस समस्या को हल करने के तरीके हैं, लेकिन मुझे व्यापक उपयोग में किसी भी कार्यान्वयन के बारे में पता नहीं है। उदाहरण के लिए, वहाँ है rlocate
, लेकिन यह प्रतीत होता है किसी भी आधुनिक लिनक्स कर्नेल के खिलाफ काम नहीं करने के लिए।
find(1)
उपयोगकर्ता के पास इसे चलाने से अधिक विशेषाधिकार कभी नहीं है।
क्योंकि locate
एक सिस्टम पर सभी उपयोगकर्ताओं के लिए एक वैश्विक सेवा प्रदान करता है, यह अपनी updatedb
प्रक्रिया को चलाना चाहता है root
ताकि यह पूरे फाइल सिस्टम को देख सके। यह सुरक्षा समस्याओं का एक विकल्प है:
updatedb
रूट के रूप में चलाएं , लेकिन इसकी आउटपुट फ़ाइल को विश्व-पठनीय बनाएं ताकि locate
विशेष विशेषाधिकार के बिना चल सकें । यह प्रभावी रूप से सभी उपयोगकर्ताओं के लिए सिस्टम की सभी फाइलों के नामों को उजागर करता है। यह वास्तविक समस्या पैदा करने के लिए सुरक्षा उल्लंघन के लिए पर्याप्त हो सकता है।
बीएसडी locate
मैक ओएस एक्स और फ्रीबीएसडी पर इस तरह से कॉन्फ़िगर किया गया है।
डेटाबेस को केवल पढ़ने योग्य के रूप में लिखें root
, और locate
setuid
रूट बनाएं ताकि यह डेटाबेस को पढ़ सके। इसका मतलब यह है कि locate
प्रभावी रूप से ओएस की अनुमति प्रणाली को फिर से लागू करना है ताकि यह आपको ऐसी फाइलें न दिखाए जो आप सामान्य रूप से नहीं देख सकते हैं। यह आपके सिस्टम की हमले की सतह को भी बढ़ाता है, विशेष रूप से रूट एस्केलेशन हमले को जोखिम में डालकर ।
locate
डेटाबेस फ़ाइल के मालिक के लिए एक विशेष " " उपयोगकर्ता या समूह बनाएँ, और उस उपयोगकर्ता / समूह के लिए locate
बाइनरी को चिह्नित करें setuid/setgid
ताकि यह डेटाबेस पढ़ सके। यह अपने आप में विशेषाधिकार वृद्धि के हमलों को नहीं रोकता है, लेकिन यह उस क्षति को बहुत कम कर देता है जिससे कोई नुकसान हो सकता है।
mlocate
Red Hat Enterprise Linux पर इस तरह विन्यस्त है ।
हालाँकि, आपको अभी भी एक समस्या है, क्योंकि यदि आप डिबगर का उपयोग कर सकते हैं locate
या इसे डंप कोर पर ले जा सकते हैं, तो आप डेटाबेस के विशेषाधिकार प्राप्त भागों पर प्राप्त कर सकते हैं।
मुझे locate
सिस्टम पर प्रत्येक उपयोगकर्ता के लिए इसे अलग से चलाने का एक सही मायने में "सुरक्षित" कमांड बनाने का कोई रास्ता नहीं दिखता है, जो कि इसके अधिक लाभ को नकार देता है find(1)
।
निचला रेखा, दोनों बहुत उपयोगी हैं। locate(1)
बेहतर है जब आप केवल नाम से एक विशेष फ़ाइल खोजने की कोशिश कर रहे हैं, जिसे आप जानते हैं कि मौजूद है, लेकिन आपको अभी याद नहीं है कि यह वास्तव में कहां है। find(1)
जब आपके पास जांच करने के लिए एक केंद्रित क्षेत्र हो, या जब आपको इसके कई लाभों में से किसी की आवश्यकता हो तो बेहतर है।
find -- "$dir"
कि मजबूत नहीं ( $dir
एक विधेय के लिए लिया जा सकता है), सिम्लिंक, दौड़ की स्थिति के मुद्दों की विशेषताओं का परीक्षण करने का कोई तरीका नहीं ... मेरे लिए find
और locate
दो अलग-अलग समस्याओं का समाधान करना। ऐसी कई जगहें हैं जहां खोज का उपयोग वास्तविक नहीं है (जैसे लाखों फ़ाइलों वाली निर्देशिकाएं)। पता लगाना एक अनुक्रमण प्रणाली है जो फ़ाइल नामों तक सीमित है।
locate
लगभग कुछ हद तक पसंद आया था find / -type f | gzip > locate.gz
, औरzgrep "$1" <locate.gz
locate
में है findutils
पैकेज है, और अपने updatedb
कार्यक्रम के संदर्भ में लागू किया गया है find(1)
। तो उस अर्थ में, locate(1)
वास्तव में आवश्यकता है find(1)
। :)
find
, locate
आदि अन्य वर्गों में है, इसलिए इसे के विभिन्न वर्गों में इस्तेमाल एक ही नाम को स्पष्ट करने के लिए वहाँ हो की जरूरत नहीं है मैनुअल (उदाहरण के लिए unlink(1)
बनाम unlink(2)
), हम में से जो लोग सम्मेलन में आते थे, वे एक मैन पेज संदर्भ के रूप में देखते थे।
locate
एक प्रीबिल्ट डेटाबेस का उपयोग करता है, जिसे नियमित रूप से अपडेट किया जाना चाहिए, जबकि find
फ़ाइलों का पता लगाने के लिए एक फाइल सिस्टम पर पुनरावृत्त होता है।
इस प्रकार, locate
की तुलना में बहुत तेज़ है find
, लेकिन गलत हो सकता है अगर डेटाबेस -कैन को कैश के रूप में देखा जाए- अपडेट नहीं किया गया है ( updatedb
कमांड देखें )।
इसके अलावा, find
अधिक ग्रैन्युलैरिटी की पेशकश कर सकते हैं, जैसा कि आप इसकी प्रत्येक विशेषता से फ़ाइलों को फ़िल्टर कर सकते हैं, जबकि locate
फ़ाइल नामों के खिलाफ मिलान किए गए पैटर्न का उपयोग करता है।
find
मैन पेज के सावधान उपयोग के बिना सफलतापूर्वक यूनिक्स के नौसिखिया या सामयिक उपयोगकर्ता के लिए संभव नहीं है। उपयोगकर्ता-शत्रुता को जोड़कर , ऐतिहासिक रूप से, कुछ संस्करणों find
ने भी -print
विकल्प को डिफ़ॉल्ट नहीं किया ।
locate
कम लचीला है, लेकिन आम मामले में उपयोग करने के लिए अधिक सहज है।
find . -name 'nametosearch'
, या -iname
केस-असंवेदनशील के लिए। .
वर्तमान निर्देशिका के अलावा अन्य खोज करने के लिए निर्देशिका पथ के साथ बदलें । वहाँ, कि एक नौसिखिया उपयोगकर्ता की आवश्यकताओं का 90% भी फ़ाइल ग्लोबिंग में शामिल किए बिना कवर किया गया है। (मैं आमतौर पर उपयोग करता find . -iname '*partialfilename*'
हूं और यदि मैं खोज रहा हूं /
, तो मैं उपयोग find / -maxdepth 5 -iname '*partialname*'
करता हूं जो खोज समय में कटौती करता है, जबकि 90% समय में जो कुछ भी मैं चाहता हूं वह सब कुछ
पता लगाने की थोड़ी सी कमी यह है कि यह उस फ़ाइल सिस्टम के क्षेत्र को अनुक्रमणित नहीं कर सकता है जिसमें आप रुचि रखते हैं। डेबियन डेस्कटॉप सिस्टम पर, उदाहरण के लिए लिनक्स मिंट 17.2, /etc/updatedb.conf फ़ाइल को कुछ क्षेत्रों को विचार से बाहर करने के लिए कॉन्फ़िगर किया गया है। , सहित / tmp, / var / स्पूल, और /home/.ecryptfs।
/Home/.ecryptfs को अनदेखा करने से एन्क्रिप्टेड निर्देशिकाओं में फ़ाइल नामों को अनधिकृत उपयोगकर्ताओं के संपर्क में आने से रोकता है। हालाँकि, यदि आपकी होम डाइरेक्टरी को ecryptfs से एन्क्रिप्ट किया गया है, तो इसका मतलब यह भी है कि आपके होम डाइरेक्टरी को अनुक्रमित नहीं किया गया है, और इसलिए आपके होम डाइरेक्टरी में कभी भी कुछ भी नहीं मिलेगा। यह आपके लिए काफी हद तक बेकार हो सकता है (यह मेरे लिए है)। परिणाम न मिलने के अलावा, अपडेट की गई प्रक्रिया समय-समय पर आपकी डिस्क को बिना किसी लाभ के लोड करेगी, और यदि आप सिस्टम के मुख्य या एकमात्र उपयोगकर्ता हैं, तो यह अक्षम भी हो सकता है।