बनाम पता लगाएं


30

डिस्क पर फ़ाइलों की खोज करने के लिए कमांड findऔर हैं locate

मुझे पता है कि findफ़ाइलों की खोज करने के लिए सभी आवश्यक उपनिर्देशिकाओं की पुनरावृत्ति प्रक्रिया होती है और इसलिए धीमी गति से अप-टू-डेट होती है, जबकि locateएक डेटाबेस का उपयोग करता है जो हर अब और फिर (जब वास्तव में?) अपडेट हो जाता है जल्दी से परिणाम दिखाने के लिए जो हालांकि पुराना हो सकता है।

क्या कोई अन्य मतभेद हैं? किन स्थितियों में व्यक्ति एक या दूसरे को पसंद करेगा? और locateडेटाबेस आमतौर पर कब अपडेट होता है?




@Rinzwind लिंक किए गए U & L का उत्तर भयानक है, यह एक शर्म की बात है कि हम क्रॉस-साइट डुप्लिकेट नहीं बना सकते हैं। लेकिन क्या आप क्रोनजोब के बारे में अधिक जानते हैं, जब यह वास्तव में चलेगा? स्टार्टअप के बाद? एक विशिष्ट समय पर (मुझे लगता है कि मैंने 1-2AM या ऐसा कुछ पढ़ा है) केवल? यदि यह उस समय बंद हो जाता है तो क्या होता है? क्या यह तब शुरू होता है जब कंप्यूटर निष्क्रिय है? मैं डेटाबेस की आयु कैसे देख सकता हूं?
बाइट कमांडर

2
@ बाइटकमांडर - यही तो anacronहै। मुझे नहीं पता कि यह डेस्कटॉप सिस्टम / सर्वर पर डिफ़ॉल्ट रूप से स्थापित है, लेकिन यह नोटबुक पर है। यह बूट पर चलता है और देखता है कि सिस्टम बंद होने के दौरान कोई क्रॉन जॉब्स चलना चाहिए था या नहीं। यह वास्तव में मददगार है, लेकिन कुछ मुद्दों का कारण बन सकता है यदि आपके पास आधी रात को दूर से निर्धारित नौकरियां हैं। यह नौकरी को बूट पर चलाने का कारण बन सकता है और फिर समय आने पर - संभवतया 24 घंटे बाद (दैनिक नौकरी के लिए) से बहुत कम।
जो से

@Joe तो यह बूट के दौरान चलेगा और इसे धीमा कर देगा, या क्या यह बूट के बाद कुछ समय चलेगा, या क्या यह आमतौर पर इतनी कम प्राथमिकता के साथ चलता है कि यह सिर्फ सिस्टम के निष्क्रिय होने पर चलता है?
बाइट कमांडर

जवाबों:


27

locateवास्तव में केवल फाइलों को खोजने और उन्हें मनुष्यों को प्रदर्शित करने के लिए अच्छा है। आप इसके साथ कुछ चीजें कर सकते हैं, लेकिन मैं इसे पार्स करने के लिए पर्याप्त भरोसा नहीं करूंगा-और जैसा कि आप कहते हैं- आंतरिक डेटाबेस की स्थिति की गारंटी देना असंभव है, अधिक इसलिए कि यह केवल /etc/cron.daily/mlocateएक दिन में एक बार से चलना है!

findलाइव है। यह फ़िल्टर, बहिष्कृत, निष्पादित करता है। यह पार्सिंग के लिए उपयुक्त है। यह सापेक्ष पथों का उत्पादन कर सकता है। यह पूर्ण पथ आउटपुट कर सकता है। यह सिर्फ नामों से नहीं, बल्कि विशेषताओं के आधार पर चीजें कर सकता है।

locateनिश्चित रूप से मेरे टूलबॉक्स में एक जगह है, लेकिन यह आमतौर पर कुछ खोजने के लिए अंतिम-खाई प्रयास के रूप में नीचे स्थित है। इससे findभी आसान है ।


2
locateअगर मैं अपनी पूरी फाइलसिस्टम को खोजना चाहता हूं तो मुझे बहुत तेजी से पता चलता है। और आप इसे उपयोग करने updatedbसे पहले डेटाबेस को मैन्युअल रूप से अपडेट कर सकते हैं ।
hytromo

आप जानते हैं कि क्रोनजॉब बिल्कुल कैसे कॉन्फ़िगर किया गया है? क्या यह एक विशिष्ट समय पर चलता है या जब स्टार्टअप के बाद सिस्टम निष्क्रिय या एन मिनट पर होता है? क्योंकि मुझे लगता है कि मैंने कहीं पढ़ा है कि यह 1-2AM पर निर्धारित होता है, जब मेरी मशीन आमतौर पर बंद हो जाती है। मैन्युअल रूप से ( sudo updatedb) को छोड़कर क्या यह कभी अपडेट नहीं होगा ? और यह देखने का मौका है कि डेटाबेस कितना पुराना है?
बाइट कमांडर

grep run-parts /etc/crontabआप देखेंगे कि इनका प्रबंधन किया जा रहा है anacron(जो आप देखेंगे man anacronकि यह उन प्रणालियों के लिए अधिक लचीला है जो हर समय नहीं हैं)। यदि आप मूल क्रॉन समय को याद करते हैं तो इसके बजाय मैं इसे बूट पर चला सकता हूं।
ओली

2
मुझे पता है कि मेरे हटाने योग्य / अनमाउंट विभाजन को इंडेक्स नहीं करता है, इसलिए यदि मैं उन पर कुछ खोजना चाहता हूं, तो मुझे खोज का उपयोग करना होगा। बेशक, पता लगाने के लिए सभी अद्भुत विकल्प नहीं हैं, जो करता है - जैसे कि -exec command {} \;हर फ़ाइल पर एक कमांड चलाना पसंद है। मैं उपयोग करना पसंद करता हूं, locate -bजो उन फ़ाइलों को खोजने के लिए प्रतिबंधित करता है जो नाम के अंतिम घटक पर मेल खाते हैं - बाकी पथ के बिना। मैं अक्सर कोशिश करता हूं कि सबसे पहले क्योंकि यह बहुत तेज है। इसके अलावा, आप sudo updatedbकिसी भी समय चला सकते हैं जब आप खोज डेटाबेस को ताज़ा करना चाहते हैं।
जो

अगर आपको वास्तविक समय की खोज की आवश्यकता है जो कुछ हद तक आसान है, तो आप कुछ का उपयोग कर सकते हैं जैसेls -R | grep 'file_name.txt'
जेना

8

जितना मुझे ओली पसंद है (जो बहुत है!) मैं उसके साथ findआज्ञा पर असहमत हूं । मुझे यह पसंद नहीं है।

find कमांड में तीन मिनट लगते हैं

उदाहरण के लिए इस सरल कमांड को लें:

$ time find / -type f -name "mail-transport-agent.target"
find: ‘/lost+found’: Permission denied
find: ‘/etc/ssmtp’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
    (... SNIP ...)
find: ‘/run/user/997’: Permission denied
find: ‘/run/sudo’: Permission denied
find: ‘/run/systemd/inaccessible’: Permission denied

real    3m40.589s
user    0m4.156s
sys     0m8.874s

यह अधिक लेता है तीन मिनट के लिए findसे सब कुछ शुरू खोज करने के लिए /। डिफ़ॉल्ट रूप से त्रुटि संदेश दिखाई देते हैं और आपको उनके माध्यम से खोजना होगा कि आप क्या खोज रहे हैं। फिर भी grepएक स्ट्रिंग के लिए पूरी ड्राइव को खोजना बेहतर है जिसमें 53 घंटे लगते हैं : `grep` एक स्ट्रिंग के लिए सभी फ़ाइलों को लंबे समय तक

मुझे पता है कि मैं इसे बेहतर तरीके से काम करने के लिए खोज कमांड के मापदंडों के साथ फील कर सकता हूं, लेकिन यहां बात यह है कि इसे चलाने में कितना समय लगता है।

locate कमांड को एक सेकंड से भी कम समय लगता है

अब उपयोग करते हैं locate:

$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target

real    0m0.816s
user    0m0.792s
sys     0m0.024s

पता लगाने के आदेश एक सेकंड से भी कम समय लगता है!

updatedb केवल डिफ़ॉल्ट रूप से दिन में एक बार चलाएं

यह सही है कि updatedbजो कमांड डेटाबेस को अपडेट करता है वह दिन में केवल एक बार डिफ़ॉल्ट रूप से चलता है। आप इसे केवल उपयोग करके जोड़ी गई फ़ाइलों की खोज करने से पहले मैन्युअल रूप से चला सकते हैं:

$ time sudo updatedb

real    0m3.460s
user    0m0.503s
sys     0m1.167s

हालाँकि इसमें 3 सेकंड का समय लगेगा, यह findकमांड के 3+ मिनट की तुलना में छोटा है ।

मैंने sudo crontab -eनीचे लाइन में शामिल करने के लिए अपना अपडेट दिया है:

# m h  dom mon dow   command
  0 0  1   *   *     /bin/journalctl --vacuum-size=200M
*/5 *  *   *   *     /usr/bin/updatedb

अब हर पाँच मिनट updatedbमें चलाया जाता है और locateडेटाबेस को लगभग हमेशा अद्यतित किया जाता है।

लेकिन कोई विशेषता नहीं हैं?

आप locateआउटपुट को अन्य कमांड पर पाइप कर सकते हैं । यदि उदाहरण के लिए आप चाहते हैं कि फ़ाइल विशेषताएँ आप उपयोग कर सकें:

$ locate mail-transport-agent.target | xargs stat
  File: '/lib/systemd/system/mail-transport-agent.target'
  Size: 473         Blocks: 8          IO Block: 4096   regular file
Device: 10305h/66309d   Inode: 667460      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-03-31 18:11:55.091173104 -0600
Modify: 2017-10-27 04:11:45.000000000 -0600
Change: 2017-10-28 07:18:24.860065653 -0600
 Birth: -

सारांश

मैंने यह उत्तर पोस्ट करने की गति और उपयोग में आसानी दिखाने के लिए पोस्ट किया है locate। मैंने दूसरों द्वारा बताई गई कुछ छोटी-छोटी आज्ञाओं को संबोधित करने की कोशिश की।

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


@EliahKagan लेकिन खोज कमांड सभी ड्राइव के विभाजन पर सभी निर्देशिकाओं और फ़ाइलों को सूचीबद्ध करने और सूचीबद्ध करने के माध्यम से स्क्रॉल कर रहा था। यह काम करता हुआ दिखाई दिया और मैं अंत में एक प्रिंटआउट की उम्मीद कर रहा था ... किसी भी तरह यह "फिक्सिंग" के बारे में नहीं था जो खोज कमांड को खोज रहा था वह समय प्राप्त करने के बारे में था। रनिंग locate / display-auto-brightnessमें 17 सेकंड का समय लगता है और यह हर डायरेक्टरी और फाइल को सभी डिस्क पर प्रदर्शित करता है।
WinEunuuchs2Unix

@EliahKagan मैं समझता हूं। --regexआवश्यक था क्योंकि मेरे खोज स्ट्रिंग के साथ बहुत सारे परिणाम लौटे थे। मुझे खोजने और खोजने और कुछ ही मिनटों में अपना उत्तर अपडेट करने के लिए दो नए उदाहरण मिलेंगे।
WinEunuuchs2Unix

1
एलियाह की बात को स्पष्ट करने के लिए, उस findआदेश का अर्थ है "निर्देशिकाओं में सभी फ़ाइलों के फ़ाइलनाम को प्रिंट करें /और display-auto-brightness"। मुझे लगता है कि आप उपयोग करने के लिए थे find / -name display-auto-brightness, लेकिन यहां तक ​​कि बहुत सारे रद्दी "अनुमति से इनकार" त्रुटियों को प्रिंट करता है।
wjandrea

@wjandrea हां जैसा कि मैंने कहा कि बिंदु को फ़ाइल नहीं मिल रही थी, यह समय था कमांड को खोजने का। मैं कैश को फ्लश करने के बाद वैध मापदंडों के साथ अब फिर से परीक्षण कर रहा हूं। तब मैं उत्तर को अपडेट करूंगा।
विनयुनुच्स

1
@ नहीं, आपका उदाहरण अभी भी मान्य है, और मुझे नहीं लगता कि प्रसंस्करण समय बहुत बदल गया है, चाहे फ़ाइल मिली या नहीं।
wjandrea
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.