অনুসন্ধান বনাম সন্ধান করুন: একে অপরের ব্যবহার, উপকারিতা এবং বিপরীতে


132

লিনাক্স এবং ইউনিক্স সিস্টেমে দুটি সাধারণ অনুসন্ধান কমান্ড রয়েছে: locateএবং find

প্রতিটি আগপাছ কি হয়? একজনের যখন অন্যের থেকে বেশি সুবিধা হয়?


6
উদাহরণস্বরূপ দেখুন superuser.com/questions/199472/…
জোফেল

উত্তর:


166

locate(1)মাত্র একটি বড় সুবিধা আছে find(1): গতি।

find(1)যদিও এর অনেক সুবিধা রয়েছে locate(1):

  • find(1)এটি আধ্যাত্মিক, এটিটি অ্যান্ড টি ইউনিক্সের প্রথম সংস্করণে ফিরে যাচ্ছে । এমনকি এটি ব্যাসবক্সের মাধ্যমে কাটা-ডাউন এমবেডড লিনাক্সগুলিতে পাবেন । এটি সর্বজনীন তবে সর্বজনীন।

    locate(1)তুলনায় অনেক কম বয়সী find(1)। প্রথম দিকের পূর্বপুরুষ locate(1) 1983 সাল পর্যন্ত উপস্থিত হন নি এবং এটি locate1994 অবধি " " হিসাবে ব্যাপকভাবে উপলব্ধ ছিল না , যখন এটি জিএনইউ অনুসন্ধানকারী এবং 4.4BSD তে গৃহীত হয়েছিল

  • locate(1)এছাড়াও মানহীন , সুতরাং এটি সর্বত্র ডিফল্টরূপে ইনস্টল করা হয় না। কিছু পজিক্স টাইপ ওএস অপশন হিসাবে এটি সরবরাহ করে না এবং যেখানে এটি উপলব্ধ রয়েছে বাস্তবায়নে আপনার পছন্দের বৈশিষ্ট্যগুলির অভাব থাকতে পারে কারণ ন্যূনতম বৈশিষ্ট্য সেট নির্দিষ্ট করে এমন কোনও স্বাধীন মান নেই যা অবশ্যই উপলব্ধ।

    একটা হল কার্যত মান, হচ্ছে বাসদlocate(1) , কিন্তু যে শুধুমাত্র কারণ অন্য দুই প্রধান স্বাদে locateতার সমস্ত বিকল্পগুলির বাস্তবায়ন: -0, -c, -d, -i, -l, -m, -s, এবং -Smlocateবাসদ 6 অতিরিক্ত অপশন প্রয়োগ না locate: -b, -e, -P, -q, --regexএবং -wগনুহlocate ঐ ছয়টি প্লাস অন্য প্রয়োগ চার : -A, -D, -E, এবং -p। (আমি alias লেখা মত ছোটখাট পার্থক্য উপেক্ষা করছি -?বনাম -hবনাম --help।)

    বিএসডি এবং ম্যাক ওএস এক্স জাহাজ বিএসডি করে locate

    বেশিরভাগ লিনাক্স জিএনইউ পাঠায় locateতবে রেড হ্যাট লিনাক্স এবং আর্চ শিপ mlocateপরিবর্তে। দেবিয়ান তার বেস ইনস্টলটিতে কোনও ইনস্টল করে না, তবে এটির ডিফল্ট প্যাকেজ সংগ্রহস্থলগুলিতে উভয় সংস্করণ সরবরাহ করে; যদি উভয়ই একবারে ইনস্টল করা থাকে তবে " locate" রান করে mlocate

    ওরাকল ডিসেম্বর 2014 এ প্রকাশিত 11.2 সাল থেকেmlocate সোলারিসে শিপিং করছে that এর আগে সোলারিসে ডিফল্টরূপে ইনস্টল করা হয়নি। (সম্ভবত, এটি সোলারিসের কমান্ডটি অরাকল লিনাক্সের সাথে অসম্পূর্ণতা হ্রাস করার জন্য করা হয়েছিল , যা রেড হ্যাট এন্টারপ্রাইজ লিনাক্সের উপর নির্ভরশীল , যা ব্যবহার করে ।)locatemlocate

    আইবিএম, AIX এখনো কোনো সংস্করণ পাঠাতে পারেনি locate, অন্তত, AIX 7.2 হিসাবে , যদি না আপনি গনুহ ইনস্টল findutilsথেকে লিনাক্স ফর এপ্লিকেশনস, AIX টুলবক্স

    এইচপি-ইউএক্স এছাড়াও উপস্থিত অভাব locateবেস সিস্টেমের মধ্যে।

    পুরানো "আসল" ইউনিক্সগুলিতে সাধারণত কোনও প্রয়োগের অন্তর্ভুক্ত থাকে না locate

  • find(1)অনেকগুলি ফাংশন, বুলিয়ান অপারেটর ইত্যাদির সাথে একটি শক্তিশালী এক্সপ্রেশন সিনট্যাক্স রয়েছে

  • find(1)শুধু নামের চেয়ে বেশি ফাইল নির্বাচন করতে পারে। এটি দ্বারা নির্বাচন করতে পারেন:

    • বয়স
    • আয়তন
    • মালিক
    • ফাইলের ধরন
    • টাইমস্ট্যাম্প
    • অনুমতি
    • সাবট্রির মধ্যে গভীরতা ...
  • নাম অনুসারে ফাইলগুলি সন্ধান করার সময়, আপনি নিয়মিত এক্সপ্রেশন ব্যবহার করে সমস্ত সংস্করণে বা জিএনইউ বা বিএসডি সংস্করণে ফাইল গ্লোব্বিং সিনট্যাক্স ব্যবহার করে অনুসন্ধান করতে পারেন ।find(1)

    বর্তমান সংস্করণগুলি locate(1)যেমন গ্লোব নিদর্শনগুলি গ্রহণ findকরে তবে বিএসডি locateমোটেও রেজিڪس করে না। আপনি যদি আমার মতো হন এবং বিভিন্ন ধরণের মেশিন ব্যবহার করতে 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সেটির উপরে ফ্ল্যাগ লাগাতে ফাইল অস্তিত্ব জন্য চেক করতে নাম মুদ্রণ প্রতিটি ফাইল গত আবিষ্কৃত আগে, কিন্তু এই কিছু দূরে eats 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)আপনার যখন পরীক্ষা করার জন্য একটি কেন্দ্রীভূত অঞ্চল রয়েছে বা যখন এর অনেকগুলি সুবিধাগুলির মধ্যে আপনার কোনও প্রয়োজন হয় তখন ভাল is


দুঃখিত, আমি "স্লোক" অনুচ্ছেদটিকে উপেক্ষা করেছি। rlocon বাসি ক্যাশে ইস্যু সম্বোধন করে । আপনি সন্ধানের সন্ধানের কয়েকটি উল্লেখ করতে চাইতে পারেন, যেমন find -- "$dir" শক্তিশালী নয় ( $dirএকটি প্রাকটিকের জন্য নেওয়া যেতে পারে), কোনও সিমিলিংকের বৈশিষ্ট্যগুলির জন্য পরীক্ষা করার কোনও উপায় নয়, বর্ণের শর্ত সম্পর্কিত সমস্যাগুলি ... আমার জন্য findএবং locateদুটি ভিন্ন সমস্যার সমাধান করতে পারেন। অনেকগুলি জায়গা রয়েছে যেখানে সন্ধান ব্যবহার করা বাস্তববাদী নয় (যেমন লক্ষ লক্ষ ফাইল ধারণকারী ডিরেক্টরি)। অবস্থান ফাইলের নামের মধ্যে সীমাবদ্ধ একটি সূচক সিস্টেম।
স্টাফেন চেজেলাস

2
প্রথম বাস্তবায়নগুলি locateমোটামুটি কিছু মত ছিল find / -type f | gzip > locate.gz, এবংzgrep "$1" <locate.gz
এফ হৌরি

@ এফ.হৌরি: আকর্ষণীয় ট্রিভিয়া। এখানে আরো রয়েছে: গনুহ locateহয় findutilsপ্যাকেজ, এবং তার updatedbপ্রোগ্রাম পদ বাস্তবায়িত হয় find(1)। সুতরাং যে অর্থে, locate(1)আসলে প্রয়োজন find(1) । :)
ওয়ারেন ইয়াং

1
@ ওয়ারেন ইউং কেন কেবল ফু এর পরিবর্তে ফু (1) এর নিয়মিত উল্লেখ রয়েছে? ফু এর বিভিন্ন সংস্করণ আছে কি?
বাদামি ন্যাটি প্রায়

4
@nuttyaboutnatty: এটা ইউনিক্স ম্যানুয়াল একটি প্রাচীন কনভেনশন, ম্যানুয়াল অধ্যায় 1. যদিও এটা সত্য নেই কোন মানে find, locateইত্যাদি অন্যান্য বিভাগে, তাই এটি বিভিন্ন বিভাগে ব্যবহৃত একই নামের দুর্বোধ্য সেখানে হতে হবে তা নয় ম্যানুয়াল (যেমন unlink(1)বনাম unlink(2)), আমাদের মধ্যে যারা কনভেনশন করত তারা দেখতে পাবে যে ম্যান পেজ রেফারেন্স হিসাবে।
ওয়ারেন ইয়ং

35

locateএকটি প্রাক-বিল্ট ডাটাবেস ব্যবহার করে, যা নিয়মিত আপডেট করা উচিত, যখন findফাইলগুলি সনাক্ত করতে কোনও ফাইল সিস্টেমের মাধ্যমে পুনরাবৃত্তি হয়।

সুতরাং, locateতুলনায় অনেক দ্রুত find, তবে ডাটাবেস-ক্যাশে হিসাবে দেখা যেতে পারে- আপডেট না হলে ( updatedbকমান্ড দেখুন) ভুল হতে পারে ।

এছাড়াও, findআরও গ্রানুলারিটি অফার করতে পারে, কারণ আপনি এর প্রতিটি বৈশিষ্ট্য দ্বারা ফাইলগুলি ফিল্টার করতে পারবেন, এবং locateফাইলের নামের সাথে মেলে এমন একটি প্যাটার্ন ব্যবহার করুন।


7

findইউনিক্সের একজন নবজাতক বা মাঝেমধ্যে ব্যবহারকারীর পক্ষে ম্যান পৃষ্ঠার সতর্কতা অবলম্বন না করে সফলভাবে ব্যবহার করা সম্ভব নয়। .তিহাসিকভাবে, এর কিছু সংস্করণ অপশনটিকে findডিফল্ট করে না -print, ব্যবহারকারী-বৈরিতা জুড়ে দেয়।

locate কম নমনীয়, তবে সাধারণ ক্ষেত্রে ব্যবহার করার চেয়ে অনেক বেশি স্বজ্ঞাত।


1
অন্যদিকে সনাক্ত করতে একটি ডিবি বজায় রাখতে হবে এবং পর্যায়ক্রমে চালাতে হয়, তাই আমি এটি আমাদের ব্যক্তিগত নেটওয়ার্কে থাকা সমস্ত লিনাক্স সার্ভারগুলিতে এটিকে অক্ষম করে দিয়েছি।
রুই এফ রিবেইরো

2
এটি সম্পর্কে কি কঠিন? find . -name 'nametosearch', বা -inameক্ষেত্রে সংবেদনশীল জন্য। .বর্তমান ডিরেক্টরি বাদে অন্য অনুসন্ধানের জন্য ডিরেক্টরি পথের সাথে প্রতিস্থাপন করুন । সেখানে, কোনও নবজাতকের ব্যবহারকারীর প্রয়োজনীয়তার 90% প্রয়োজনীয়তা এমনকি ফাইল গ্লোববিংয়ে না coveredাকা। (আমি সাধারণত ব্যবহার করেন find . -iname '*partialfilename*'আর যদি আমি থেকে অনুসন্ধান করছি /, আমি ব্যবহার find / -maxdepth 5 -iname '*partialname*'যা নিচে সার্চ সময় মধ্যেও যখন সবকিছু আমি সময় 90% সেখানে, এর মধ্যবর্তী ব্যবহারকারীদের প্রয়োজনীয়তা 75% আগ্রহী খোঁজার।।) :)
ওয়াইল্ডকার্ড

2

সনাক্তকরণের সামান্য ব্যর্থতা হ'ল এটি আপনার আগ্রহী ফাইল সিস্টেমের ক্ষেত্রটি সূচীকরণ নাও করতে পারে De / tmp, / var / spool এবং / home/.ecryptfs সহ।

/Home/.ecryptfs উপেক্ষা করা এনক্রিপ্টড ডিরেক্টরিগুলিতে ফাইলের নামগুলি অননুমোদিত ব্যবহারকারীদের কাছে প্রকাশ করা থেকে বাধা দেয়। যাইহোক, যদি আপনার হোম ডিরেক্টরিটি ইক্য্রিপ্টফগুলি দিয়ে এনক্রিপ্ট করা থাকে তবে এর অর্থ হ'ল আপনার হোম ডিরেক্টরিটি সূচীভূত নয়, এবং এটির ফলে আপনার হোম ডিরেক্টরিতে কোনও কিছুই খুঁজে পাবে না। এটি আপনার পক্ষে এটি বেশিরভাগ ক্ষেত্রে অকেজো হতে পারে (এটি আমার পক্ষে হয়)। ফলাফলগুলি না খুঁজে পাওয়ার পাশাপাশি আপডেটেডব প্রক্রিয়াটি আপনার ডিস্কটি কোনও সুবিধা ছাড়াই পর্যায়ক্রমে লোড করবে এবং আপনি যদি সিস্টেমের প্রধান বা একমাত্র ব্যবহারকারী হন তবে তা অক্ষমও হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.