কোনও ফাইলের কয়েকশ স্ট্রিংয়ের জন্য ডিরেক্টরিতে কীভাবে হাজারো ফাইল গ্রেপ করবেন


11

আমি একটি grepবিবৃতি রচনার চেষ্টা করছি এবং এটি আমাকে হত্যা করছে। আমিও arguments list too longত্রুটি পেয়ে ক্লান্ত হয়ে পড়েছি । আমার একটি ফাইল আছে, আসুন এটি কল করুন subset.txt। এটিতে নির্দিষ্ট স্ট্রিং সহ কয়েকশ লাইন রয়েছে MO43312948। আমার অবজেক্ট ডিরেক্টরিতে আমার কাছে কয়েক হাজার ফাইল রয়েছে এবং আমার subset.txtঅন্য সমস্ত ডিরেক্টরিতে তালিকাবদ্ধ স্ট্রিংগুলি থাকা সমস্ত ফাইলের কপি করতে হবে ।

আমি এটি দিয়ে শুরু করার চেষ্টা করছিলাম কেবলমাত্র অবজেক্ট ডিরেক্টরি থেকে ম্যাচের ফাইলগুলি ফিরিয়ে আনতে।

grep -F "$(subset.txt)" /objects/*

আমি `বাশ: / বিন / গ্রেপ: আর্গুমেন্টের তালিকাটি বেশ দীর্ঘ ``


6
আপনি "$(subset.txt)"কমান্ডটি এমনভাবে রাখলেন কেন ? এটি হ'ল কমান্ড প্রতিস্থাপন , যা আপনার শেলকে কার্যকর করতে সক্ষম করবে subset.txt(যেন এটি কোনও আদেশ বা স্ক্রিপ্ট) were
JigglyNaga

উত্তর:


23

তোমার লক্ষ্য হিসেবে ডিরেক্টরির পাস করতে পারেন grepসঙ্গে -Rসঙ্গে ইনপুট রীতির একটি ফাইল -f:

  -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  If this option is used
          multiple  times  or  is  combined with the -e (--regexp) option,
          search for all patterns given.  The  empty  file  contains  zero
          patterns, and therefore matches nothing.

   -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.

সুতরাং, আপনি খুঁজছেন:

grep -Ff subset.txt -r objects/

আপনি এর সাথে মিলে যাওয়া ফাইলগুলির তালিকা পেতে পারেন:

grep -Flf subset.txt -r objects/

সুতরাং, যদি আপনার চূড়ান্ত তালিকাটি খুব দীর্ঘ না হয় তবে আপনি কেবল এটি করতে পারেন:

 mv $(grep -Flf subset.txt -r objects/) new_dir/

যদি এটি কোনও argument list too longত্রুটি ফেরায়, ব্যবহার করুন:

grep -Flf subset.txt -r objects/ | xargs -I{} mv {} bar/

এবং যদি আপনার ফাইলের নামগুলিতে ফাঁকা জায়গা বা অন্যান্য অদ্ভুত অক্ষর থাকতে পারে তবে ব্যবহার করুন (জিএনইউ ধরে রেখে grep):

grep -FZlf subset.txt -r objects/ | xargs -0I{} mv {} bar/

অবশেষে, আপনি বাইনারি ফাইলগুলি বাদ দিতে চাইলে, ব্যবহার করুন:

grep -IFZlf subset.txt -r objects/ | xargs -0I{} mv {} bar/

… বা mvপ্রতিটি যুক্তি দিয়ে সম্ভাব্য কয়েক হাজার আহ্বান এড়ানোর জন্য : ... | xargs -0 mv -t bar/(আপনার বিকল্পটিকে mvসমর্থন করে -t)
ডেভিড ফোস্টার

11

ব্যবহার

grep -F -f subset.txt 

subset.txtফাইল থেকে পড়তে গ্রেপকে বলতে ।

আপনি ফাইলটি হাঁটা ব্যবহার করতে পারেন।

find . -type f -exec grep -F -f subset.txt {} \;

অথবা

find . -type f -exec grep -F -f subset.txt {}  +

আপনি অতিরিক্ত ফিল্টারিং না এর findপরিবর্তে ব্যবহারের কোনও সুবিধা -r?
পিএইচকে

1
@ পিএফকে grep -rনিয়মিত ফাইলগুলিতে সিমলিংকে অনুসন্ধান করে, যা পছন্দসই বা নাও হতে পারে (যদি তারা একই গাছের মধ্যে নির্দেশ করে তবে আপনি একই ফাইলটি দু'বার সন্ধান করছেন; যদি তারা বাইরে দেখায়, আপনি এমন একটি ফাইল সন্ধান করছেন যা নাও পারে কাঙ্ক্ষিত করা)।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

আধুনিক সংস্করণগুলির grepপ্রতীকী লিঙ্কগুলির সাথে তাদের মিথস্ক্রিয়া নিয়ন্ত্রণের বিকল্প রয়েছে ( man grepবর্তমান সিস্টেমের জন্য নির্দিষ্টকরণগুলি নির্ধারণ করতে)। একটি recursive প্রতিটি ফাইলের মাধ্যমে স্বতন্ত্রভাবে চলমান তুলনায় অনেক দ্রুত grepহবে । grepfind
পেরি

1
@ পেরি আপনি কি সে সম্পর্কে নিশ্চিত? কেন? এছাড়াও, নোট করুন যে এই উত্তরটি ব্যবহার করছে -exec +, সুতরাং এটি ফাইলগুলিকে গ্রুপ করবে এবং প্রতি ফাইলের জন্য একটি গ্রেপ চালাবে না।
টেরডন

আমি সংশোধন করতে দাঁড়াও, আমি বিভিন্ন শব্দার্থবিদ্যা অবিদিত ছিল -exec {} +বনাম -exec {} \;... আপনি প্রতিদিন নতুন কিছু শিখতে (আমি এখনও কোনো কারণ কেন একটি একক রিকার্সিভ grepএকাধিক তুলনায় দ্রুততর হতে অভ্যস্ত grepএর থেকে রান findওভারহেড পার্স কিন্তু আমি প্রক্রিয়া তৈরি এবং প্যাটার্ন কারণে এটি ব্যাক আপ করতে নির্দিষ্ট নম্বর নেই)।
পেরি

3

আপনি যদি আরও গ্রেপ গতি বাড়িয়ে তুলতে চান তবে চালানোর আগে আপনি নিজের শেলটিতে লোকেল সেট করতে পারেন, অর্থাৎ "LC_ALL = c" ব্যবহার করুন। এটি গ্রেপ হিসাবে উত্তরাধিকার সূত্রে প্রাপ্ত হবে এবং যখন প্রয়োজন হবে না তখন ইউনিকোড প্রক্রিয়াকরণ অক্ষম করবে এবং কিছু ক্ষেত্রে নাটকীয়ভাবে গ্রেপকে গতি বাড়িয়ে তুলতে পারে। এটির দস্তাবেজ করার একটি দুর্দান্ত ব্লগ http://www.inmotionhosting.com/support/website/ssh/speed-up-grep-searches-with-lc- সব থেকে পাওয়া যাবে । এই কৌশলটি কেবল গ্রেপ নয়, বাশ শেল স্ক্রিপ্টগুলিকেও গতি দিতে পারে।

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