কয়েক হাজার ফাইলে গ্রেপ করুন


13

আমার সিসিএ 26,000 ফাইলের সাথে ডিরেক্টরি রয়েছে এবং আমার এই সমস্ত ফাইলগুলিতে গ্রেপ করা দরকার। সমস্যাটি হ'ল, আমার এটি যত দ্রুত সম্ভব এটির প্রয়োজন, সুতরাং স্ক্রিপ্ট তৈরি করা আদর্শ নয় যেখানে গ্রেপ একটি ফাইলের নাম সন্ধান করে এবং ফাইলগুলিতে ম্যাচগুলি লিখবে will "আর্গুমেন্টের তালিকা খুব দীর্ঘ" ইস্যু করার আগে এই সমস্ত ফাইলে গ্রেপ হতে সিসিএ 2 মিনিট সময় নেয়। কোন ধারনা কিভাবে এটা করবেন? সম্পাদনা করুন: এমন একটি স্ক্রিপ্ট রয়েছে যা সর্বদা নতুন ফাইল তৈরি করে, তাই সমস্ত ফাইলকে বিভিন্ন ডায়ারে রেখে দেওয়া সম্ভব নয়।


1
বা এর findসাথে ব্যবহার করুনxargsgrep -R
এডি_ইম

এটি ভাল কাজ করে, তবে এটি 10 ​​মিনিট সময় নেয় ...
ব্যবহারকারী 2778979

উত্তর:


19

সহ find:

cd /the/dir
find . -type f -exec grep pattern {} +

( -type fকেবলমাত্র নিয়মিত ফাইলগুলিতে সন্ধান করা ( নিয়মিত ফাইলগুলিতে ইঙ্গিত করলেও সিমলিংক বাদেও)) আপনি যদি ডিরেক্টরি বাদে কোনও প্রকারের ফাইলে অনুসন্ধান করতে চান তবে (তবে সাবধান থাকুন যে ফিফোস বা / দেব / শূন্যের মতো কিছু ধরণের ফাইল রয়েছে যা আপনি সাধারণত পড়তে চান না), -type fGNU- নির্দিষ্ট ! -xtype d( সিমলিংক রেজোলিউশনের পরে -xtype dটাইপ ডিরেক্টরি ফাইলগুলির সাথে মেলে ) দিয়ে প্রতিস্থাপন করুন )।

জিএনইউ সহ grep:

grep -r pattern /the/dir

(তবে সাবধান থাকুন যে আপনি জিএনইউ গ্রেপের সাম্প্রতিক সংস্করণ না থাকলে, ডিরেক্টরিতে নামার সময় এই চিহ্নগুলি অনুসরণ করবে)। আপনি কোনও -D readবিকল্প যোগ না করা অবধি নিয়মিত ফাইলগুলি অনুসন্ধান করা হবে না । GNU- র সাম্প্রতিক সংস্করণগুলি grepএখনও সিমলিংকের ভিতরে অনুসন্ধান করবে না।

জিএনইউর খুব পুরানো সংস্করণ findমানক {} +সিনট্যাক্স সমর্থন করে না , তবে সেখানে আপনি অ-মানক ব্যবহার করতে পারেন:

cd /the/dir &&
  find . -type f -print0 | xargs -r0 grep pattern

পারফরম্যান্সগুলি I / O সীমাবদ্ধ হতে পারে। অনুসন্ধানের সময় সেই সময়টি স্টোরেজ থেকে সমস্ত ডেটা পড়ার প্রয়োজন হয়।

যদি ডেটাটি রিডানডান্ট ডিস্ক অ্যারেতে থাকে তবে এক সাথে বেশ কয়েকটি ফাইল পড়লে কর্মক্ষমতা উন্নত হয় (এবং অন্যথায় সেগুলি হ্রাস করতে পারে)। পারফরম্যান্সগুলি যদি আই / ও বাউন্ডেড না হয় (কারণ উদাহরণস্বরূপ সমস্ত ডেটা ক্যাশে রয়েছে), এবং আপনার একাধিক সিপিইউ রয়েছে, সমবর্তী grepsপাশাপাশি সহায়তা করতে পারে। আপনি এটি GNU xargsএর -Pবিকল্পের সাহায্যে করতে পারেন ।

উদাহরণস্বরূপ, যদি ডেটা 3 ড্রাইভের সাথে একটি RAID1 অ্যারে থাকে, বা যদি ডেটা ক্যাশে থাকে এবং আপনার কাছে 3 টি সিপিইউ রয়েছে যার সময়সীমা বেঁধে দেওয়ার:

cd /the/dir &&
  find . -type f -print0 | xargs -n1000 -r0P3 grep pattern

(এখানে প্রতি 1000 ফাইলগুলিতে -n1000একটি নতুন নতুন স্প্যান ব্যবহার grepকরে একসাথে 3 টি পর্যন্ত সমান্তরালে চলমান)।

তবে মনে রাখবেন যে যদি আউটপুটটিকে grepপুনঃনির্দেশিত করা হয় তবে আপনি 3 টি grepপ্রক্রিয়া থেকে খারাপভাবে আন্তঃবিবাহিত আউটপুটটি শেষ করবেন , সেক্ষেত্রে আপনি এটিকে এটি চালাতে চান:

find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern

(সাম্প্রতিক জিএনইউ বা ফ্রিবিএসডি সিস্টেমে) বা --line-bufferedজিএনইউ বিকল্পটি ব্যবহার করুন grep

যদি patternএকটি স্থির স্ট্রিং থাকে তবে -Fবিকল্পটি যুক্ত করা বিষয়গুলির উন্নতি করতে পারে।

যদি এটি মাল্টি-বাইট চরিত্রের ডেটা না হয়, বা যদি সেই প্যাটার্নটির মিলের জন্য, তবে ডেটা মাল্টি-বাইট চরিত্র কিনা তা বিবেচনা করে না, তবে:

cd /the/dir &&
  LC_ALL=C grep -r pattern .

পারফরম্যান্স উল্লেখযোগ্যভাবে উন্নতি করতে পারে।

যদি আপনি প্রায়শই এই জাতীয় অনুসন্ধানগুলি শেষ করেন, তবে আপনি সেখানে অনেকগুলি অনুসন্ধান ইঞ্জিন ব্যবহার করে আপনার ডেটা সূচী করতে চাইতে পারেন want


3

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

কল করা findখারাপ কর্মক্ষমতা ব্যাখ্যা করতে পারে না যদি আপনি এটি ভুল না করেন। এটি ডিরেক্টরিকে ট্র্যাভার করার একটি দ্রুত উপায় এবং এটি নিশ্চিত করে তোলার যে আপনি কোনও দীর্ঘ কমান্ড লাইন কার্যকর করার চেষ্টা করবেন না। আপনি যে -exec grep PATTERN {} +কমান্ডের অনুরোধ অনুযায়ী যতগুলি ফাইল প্যাক করতে পারেন তা নিশ্চিত করুন এবং না -exec grep PATTERN {} \;, যা grepপ্রতি ফাইলের জন্য একবার সঞ্চালিত হয় : প্রতি ফাইলের মধ্যে একবার কমান্ড কার্যকর করা যথেষ্ট ধীর হতে পারে be


ধন্যবাদ, আমি এটি সম্পর্কে কিছু গুগল করব এবং সম্ভবত আমি এটি বিভক্ত করব। আপনি যা লিখছেন ঠিক আমি তা তৈরি করেছি এবং এটি কেবল
গ্রেপের

গিলস, আপনি কি বলছেন যে এক ডিরেক্টরিতে 26,000 ফাইলের তুলনায় পারফরম্যান্স উল্লেখযোগ্যভাবে পৃথক হবে 267,000 ফাইল বিতরণ করুন বলুন, 100 ডিরেক্টরি?
ব্যবহারকারী001

1
@ ব্যবহারকারী001 হ্যাঁ এগুলির মধ্যে কতটা পার্থক্য রয়েছে তা ফাইল সিস্টেম এবং সম্ভবত অন্তর্নিহিত স্টোরেজের উপর নির্ভর করে তবে আমি একাই ডিরেক্টরিতে 26000 ফাইলের তুলনায় 100 ডিরেক্টরিতে 260 ফাইলের সাথে যে কোনও ফাইল সিস্টেমকে পরিমাপযোগ্যভাবে দ্রুততর করবে বলে আশা করি।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

স্পষ্টতার জন্য ধন্যবাদ। এই তফাতটির ভিত্তি বুঝতে আমি এই বিষয়টিতে একটি ফলো-আপ প্রশ্ন জিজ্ঞাসা করেছি ।
ব্যবহারকারী001

0

আপনার যদি সমস্ত ফাইলকে একাধিকবার গ্রেপ করতে হয় (যেমন আপনি বলেছিলেন যে, স্ক্রিপ্ট চালানো) আমি র‌্যাম ডিস্কগুলি সন্ধান করার পরামর্শ দিচ্ছি, সেখানে সমস্ত ফাইল অনুলিপি করুন এবং তারপরে ফাইলগুলি একাধিকবার গ্রেপ করুন, এটি আপনার অনুসন্ধানকে একটি উপাদান দ্বারা দ্রুততর করবে কমপক্ষে 100x

আপনার কেবল পর্যাপ্ত মেষ প্রয়োজন। অন্যথায়, আপনার ফাইলগুলি সূচীকরণের দিকে লক্ষ্য করা উচিত, যেমন। লুসিন বা একটি এনএসকিএল ডাটাবেসে এবং তারপরে এগুলি নিয়ে চলমান অনুসন্ধানগুলি।


অন্য কোথাও উল্লিখিত হিসাবে, এটি এই সত্যটিকে সহায়তা করে না যে এর grepবিরুদ্ধে চালানোর জন্য প্রচুর ফাইল রয়েছে । এখানে বক্তব্যটিও রয়েছে: "এখানে একটি স্ক্রিপ্ট রয়েছে যা সর্বদা নতুন ফাইল তৈরি করে চলেছে, সুতরাং সমস্ত ফাইলকে বিভিন্ন ডায়ারে রেখে দেওয়া সম্ভব নয়" "
জেফ শ্যাচলার

-2

ডিরেক্টরিতে সমস্ত ফাইল

grep 'search string' *

পুনরাবৃত্তির সাথে

grep -R 'search string' *

-1 বিস্তৃত করতে যত্নশীল?
মার্কাস

4
আমি ডাউনওয়েট করি নি, তবে আপনার কয়েকটি সমস্যা রয়েছে: ওপি একটি "আরগের তালিকা খুব দীর্ঘ" বলে উল্লেখ করেছে, যা আপনার প্রথমটি ঠিক করবে না এবং সম্ভবত ওপি আগে যা করছিল তা হ'ল। দ্বিতীয়টি সে ক্ষেত্রে কোনওভাবেই সহায়তা করে না (আপনি যদি .তার পরিবর্তে ব্যবহার করতেন তবে সহায়তা করতেন *)। *ডট ফাইলগুলি বাদ দেবে (যদিও -আর দিয়ে, পুনরাবৃত্ত ডিরেক্টরিগুলির মধ্যে নয়)। -আর এর বিপরীতে জিএনইউ গ্রেপ এর সাম্প্রতিক সংস্করণগুলি সহ প্রতীকগুলি অনুসরণ করে। আপনার বর্তমান ডিরেক্টরিতে ফাইলগুলির সাথে একটি সমস্যা থাকবে যার নাম দিয়ে শুরু হবে-
স্টাফেন চ্যাজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.