"অনুসন্ধান" এবং "সনাক্তকরণ" এর আরও দ্রুত বিকল্পগুলি?


22

আমি আমার প্রকল্পে উত্স ফাইলগুলি অনুসন্ধান করার জন্য "সন্ধান" এবং সনাক্তকরণ "ব্যবহার করতে চাই তবে এগুলি চালাতে অনেক সময় লাগে these এই প্রোগ্রামগুলির আমি কী জানি না তার আরও দ্রুত বিকল্প আছে, বা কার্য সম্পাদনের গতি বাড়ানোর উপায়গুলি? এই প্রোগ্রামের?


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

2
আপনি কোন অবস্থান ব্যবহার করছেন? এমলোকেট দীর্ঘ পথ ধরে স্লোকের চেয়ে দ্রুততর (লক্ষ্য করুন যে আপনি যে কোনও প্যাকেজ ইনস্টল করেছেন, কমান্ডটি এখনও সনাক্ত করছে, তাই আপনার প্যাকেজ ম্যানেজারটি পরীক্ষা করুন)
পল

@ বেনহসু, আমি যখন find /usr/src -name fprintf.cআমার ওপেনবিএসডি ডেস্কটপ মেশিনে চালাচ্ছি , এটি 10 ​​সেকেন্ডেরও কম সময়ে source উত্স ফাইলগুলির অবস্থানগুলি ফিরিয়ে দেয়। locate fprintf.c | grep '^/usr/src.*/fprintf.c$'এক সেকেন্ডের অধীনে ফিরে আসে। "লম্বা সময় চালানোর জন্য" এবং আপনি কীভাবে ব্যবহার করব আপনার সংজ্ঞা কি findএবং locate?
কুসালানন্দ

@ পল, আমি মলিট ব্যবহার করছি।
বেনহসু

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

উত্তর:


16

একটি প্রকল্পে উত্স ফাইলগুলি অনুসন্ধান করা হচ্ছে

একটি সহজ কমান্ড ব্যবহার করুন

সাধারণত, কোনও প্রকল্পের উত্স এক জায়গায় হতে পারে, সম্ভবত কয়েকটি সাব-ডিরেক্টরিতে দু'তিন বা তার বেশি গভীর নীড় থাকে না, তাই আপনি একটি (সম্ভবত) দ্রুত কমান্ড যেমন ব্যবহার করতে পারেন

(cd /path/to/project; ls *.c */*.c */*/*.c)

প্রকল্পের মেটাডেটা ব্যবহার করুন

একটি সি প্রকল্পে আপনার সাধারণত একটি মেকফিল থাকে। অন্যান্য প্রকল্পে আপনার অনুরূপ কিছু থাকতে পারে। এই ফাইলগুলির একটি তালিকা বের করার দ্রুত উপায় হতে পারে (এবং তাদের অবস্থানগুলি) একটি স্ক্রিপ্ট লিখুন যা ফাইলগুলি সনাক্ত করতে এই তথ্যটি ব্যবহার করে। আমার কাছে একটি "উত্স" স্ক্রিপ্ট রয়েছে যাতে আমি কমান্ড লিখতে পারি grep variable $(sources programname)

গতিবেগ সন্ধান করুন

যেখানে সম্ভব সেখানে find / …ব্যবহারের পরিবর্তে অল্প জায়গায় অনুসন্ধান করুন find /path/to/project …। যথাসম্ভব নির্বাচনের মানদণ্ডকে সরল করুন। যদি আরও দক্ষ হয় তবে কয়েকটি নির্বাচনের মানদণ্ড স্থগিত করতে পাইপলাইনগুলি ব্যবহার করুন।

এছাড়াও, আপনি অনুসন্ধানের গভীরতা সীমাবদ্ধ করতে পারেন। আমার জন্য, এটি অনেকটা 'সন্ধানের' গতি উন্নত করে। আপনি ম্যাক্সডেপথ সুইচ ব্যবহার করতে পারেন। উদাহরণস্বরূপ '-ম্যাক্সডেপথ 5'

গতিবেগ আপ সনাক্ত

নিশ্চিত করুন এটি আপনার আগ্রহী অবস্থানগুলি সূচীকরণ করছে the ম্যান পৃষ্ঠাটি পড়ুন এবং আপনার কাজের জন্য যে কোনও বিকল্প উপযুক্ত তা ব্যবহার করুন।

   -U <dir>
          Create slocate database starting at path <dir>.

   -d <path>
          --database=<path> Specifies the path of databases to search  in.


   -l <level>
          Security  level.   0  turns  security checks off. This will make
          searchs faster.   1  turns  security  checks  on.  This  is  the
          default.

অনুসন্ধানের প্রয়োজন মুছে ফেলুন

সম্ভবত আপনি অনুসন্ধান করছেন কারণ আপনি কিছু ভুলে গেছেন যেখানে কিছু আছে বা বলা হয়নি। পূর্ববর্তী ক্ষেত্রে, নোটগুলি লিখুন (ডকুমেন্টেশন) পরে, জিজ্ঞাসা করবেন? সম্মেলন, মান এবং ধারাবাহিকতা অনেক সাহায্য করতে পারে।


10

আমি রেডগ্রিটিব্রিকের উত্তরের "গতি বাড়ানো সনাক্তকরণ" অংশটি ব্যবহার করেছি। আমি একটি ছোট ডিবি তৈরি করেছি:

updatedb -o /home/benhsu/ben.db -U /home/benhsu/ -e "uninteresting/directory1 uninteresting/directory2"

তারপরে locateএটি উল্লেখ :locate -d /home/benhsu/ben.db


6

আমি যে কৌশলটি ব্যবহার করি তা হ'ল -maxdepthবিকল্পটি প্রয়োগ করে find:

find -maxdepth 1 -iname "*target*"

আপনি যা সন্ধান করছেন তা না পাওয়া পর্যন্ত বা তাকাতে ক্লান্ত হয়ে না যাওয়া পর্যন্ত ক্রমবর্ধমান গভীরতার সাথে পুনরাবৃত্তি করুন। প্রথম কয়েকটি পুনরাবৃত্তি তাত্ক্ষণিকভাবে ফিরে আসার সম্ভাবনা রয়েছে।

এটি নিশ্চিত করে যে আপনি যখন বৃহত্তর সাব-ট্রিগুলির গভীরতা অনুসন্ধান করছেন তখন আপনি আপ-ফ্রন্ট সময় নষ্ট করবেন না যখন আপনি যা খুঁজছেন তা হায়ারার্কির গোড়ায় খুব সম্ভবত রয়েছে।


এই প্রক্রিয়াটি স্বয়ংক্রিয় করার জন্য এখানে একটি উদাহরণ স্ক্রিপ্ট রয়েছে (আপনি কী চান তা দেখতে Ctrl-C):

(
TARGET="*target*"
for i in $(seq 1 9) ; do
   echo "=== search depth: $i"
   find -mindepth $i -maxdepth $i -iname "$TARGET"
done
echo "=== search depth: 10+"
find -mindepth 10 -iname $TARGET
)

নোট করুন যে জড়িত অন্তর্নিহিত রিন্ডানডেন্সি (প্রতিটি পাসকে পূর্ববর্তী পাসগুলিতে প্রক্রিয়াকৃত ফোল্ডারগুলি অতিক্রম করতে হবে) ডিস্ক ক্যাচিংয়ের মাধ্যমে মূলত অপ্টিমাইজ করা হবে।

findবিল্ট-ইন বৈশিষ্ট্য হিসাবে এই অনুসন্ধানের অর্ডার কেন নেই ? হতে পারে কারণ বাস্তবায়িত করা জটিল / অসম্ভব বলে যদি আপনি ধরে নেন যে অতিরিক্ত কাজগুলি অগ্রহণযোগ্য নয় un -depthবিকল্পের অস্তিত্ব সম্ভাবনার ইঙ্গিত দেয় তবে হায় হায় ...


1
... এভাবে একটি "প্রস্থের প্রথম" অনুসন্ধান করা হচ্ছে
nobar

3

আর একটি সহজ সমাধান হ'ল নতুন প্রসারিত শেল গ্লোববিং ব্যবহার করা। সক্রিয় করতে:

  • বাশ: শপ-গ্লোবস্টার
  • ksh: গ্লোবস্টার সেট করুন
  • zsh: ইতিমধ্যে সক্ষম

তারপরে, আপনি শীর্ষ-স্তরের উত্স ডিরেক্টরিতে এভাবে কমান্ড চালাতে পারেন:

# grep through all c files
grep printf **/*.c

# grep through all files
grep printf ** 2>/dev/null

এর সুবিধা রয়েছে যে এটি সমস্ত উপ-ডিরেক্টরিতে পুনরাবৃত্তভাবে অনুসন্ধান করে এবং খুব দ্রুত।


3

সিলভার সন্ধানকারী

বিপুল সংখ্যক উত্স কোড ফাইলের বিষয়বস্তু খুব দ্রুত অনুসন্ধান করার জন্য আপনি এটি দরকারী বলে মনে করতে পারেন। শুধু টাইপ করুন ag <keyword>। এখানে আমার কিছু আউটপুট apt show silversearcher-ag:

আমি সাধারণত এটি দিয়ে ব্যবহার করি:

-G --file-search-regex PATTERN যাদের ফাইলগুলি PATTERN এর সাথে মেলে কেবল সেই ফাইলগুলি অনুসন্ধান করুন।

ag -G "css$" important

স্ক্রিনশট


1
ripgrep এর algorythm অভিযুক্ত দ্রুত silversearch বেশি, এবং এটি সম্মান .gitignoreফাইল এবং ছেড়ে যাওয়া .git, .svn, .hg.. ফোল্ডার নেই।
সিসিপিজ্জা

@ সিপিপিজ্জা তাই? সিলভার অনুসন্ধানকারী.gitignore ডিফল্টরূপে লুকানো এবং বাইনারি ফাইলগুলিকে সম্মান ও উপেক্ষা করে। গিথুব (14700 বনাম 8300) -র আরও বেশি অবদানকারী, আরও তারকা রয়েছে এবং ইতিমধ্যে মেয়র ডিস্ট্রোজের রেপোতে রয়েছেন। দয়া করে একটি আপডেটযোগ্য নির্ভরযোগ্য তৃতীয় পক্ষের উত্স তুলনা সরবরাহ করুন। তবুও, ripgrepসফ্টওয়্যার একটি দুর্দান্ত টুকরা দেখায়।
পাবলো এ

জানা ভাল! আমি কোনওভাবেই লেখক (গুলি) এর সাথে যুক্ত নই ripgrep, এটি কেবল আমার প্রয়োজনের সাথে খাপ খায় তাই আমি অন্যান্য বিকল্পগুলির সন্ধান বন্ধ করে দিয়েছি।
সিসিপিজ্জা

রৌপ্য অনুসন্ধানকারীও শ্রদ্ধা .gitignoreকরে। যে বলেন, rgএকেবারে আশ্চর্যজনক। প্রথমত, এটির ইউনিকোড সমর্থন রয়েছে। আমার অভিজ্ঞতায় rgধারাবাহিকভাবে কমপক্ষে দ্বিগুণ ag(ওয়াইএমএমভি) হিসাবে দ্বিগুণ দ্রুতগতিতে আমার ধারণা, এটি মরিচা রাইজেক্স পার্সারের কারণে হয়েছে, যা সম্ভবত বছরগুলিতে agনতুন ছিল না। rgনির্ধারিত আউটপুট দিতে পারে (তবে এটি ডিফল্টরূপে হয় না), এটি এমন ধরণের ফাইলগুলিকে কালো তালিকাভুক্ত করতে agপারে যেখানে কেবল শ্বেতলিস্ট থাকতে পারে, এটি আকারের (বাই বাই লগ) উপর ভিত্তি করে ফাইলগুলি উপেক্ষা করতে পারে। আমার এখনও agমাল্টিলাইন মিলের প্রয়োজনে আমি ব্যবহার করি যা rgকরতে পারে না।
পেলমিস্টার

2

প্রতিস্থাপনের জন্য, এফডি চেক করুন । মূল ফাইন্ড কমান্ডের তুলনায় এর একটি সহজ / আরও স্বজ্ঞাত ইন্টারফেস রয়েছে এবং এটি খানিকটা দ্রুত।

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