তালিকা থেকে গ্রেপ ফাইল


14

আমি কয়েক শতাধিক ফাইলের তালিকার বিরুদ্ধে গ্রেপ চালানোর চেষ্টা করছি:

$ head -n 3 <(cat files.txt)
admin.php
ajax/accept.php
ajax/add_note.php

যাইহোক, আমি জানলাম যে স্ট্রিংয়ের জন্য গ্রিপিং করছি যা আমি জানি ফাইলগুলিতে পাওয়া যায়, নিম্নলিখিত ফাইলগুলি অনুসন্ধান করে না:

$ grep -i 'foo' <(cat files.txt)

$ grep -i 'foo' admin.php
The foo was found

আমি -fপতাকাটির সাথে পরিচিত যা কোনও ফাইল থেকে নিদর্শনগুলি পড়বে । তবে কীভাবে ইনপুট ফাইল পড়বেন ?

ফর্ম্যাটটি cpসমর্থন করার মতো এবং অস্থায়ী ডিরেক্টরিতে ফাইলগুলি অনুলিপি করার ভয়ঙ্কর কাজটি আমি বিবেচনা করেছি <(cat files.txt)এবং সেখান থেকে ফাইলগুলি গ্রেপিং করেছিলাম। শিরলে আরও ভাল উপায় আছে।

উত্তর:


22

আপনি নিজেরাই ফাইল নয় বরং ফাইলের নামের তালিকাটি গ্রেপ করছেন বলে মনে হচ্ছে। <(cat files.txt)শুধু ফাইল তালিকা। <(cat $(cat files.txt))প্রকৃতপক্ষে এগুলিকে একত্রিত করার চেষ্টা করুন এবং তাদের একক স্ট্রিম হিসাবে অনুসন্ধান করুন বা

grep -i 'foo' $(cat files.txt)

সমস্ত ফাইল গ্রেপ দিতে।

তবে তালিকায় যদি খুব বেশি ফাইল থাকে তবে আপনার যুক্তি সংখ্যায় সমস্যা হতে পারে। সেক্ষেত্রে আমি শুধু লিখতাম

while read filename; do grep -Hi 'foo' "$filename"; done < files.txt

ধন্যবাদ! আমি বুঝতে পারিনি যে whileফাইল.txt এর মতো লাইনগুলি পেতে পারে।
dotancohen

আপনি এখানে split বিভক্ত + গ্লোব অপারেটরের গ্লোব অংশটি অক্ষম করতে চাইবেন (শেলটি zsh না হওয়া পর্যন্ত)।
স্টাফেন চেজেলাস

1
whileফাইল থেকে লাইনগুলি হুবহু গ্রহণ করছে না, readতা করছে; whileকেবল আমাদের এটি একটি লুপে করতে দিন। লুপটি readব্যর্থ হয়ে গেলে (অর্থাত্ একটি শূন্য-পূর্ববর্তী কোডটি দেয়) সাধারণত ফাইলটির শেষের দিকে পৌঁছে যায়।
পিএম 2 রিং

1
একটি (পাঠ্য) লাইন পড়তে, সিনট্যাক্স হয় IFS= read -r filename, read filenameঅন্য কিছু নয়।
স্টাফেন চেজেলাস

1
নোট যে -Hএকটি GNU এক্সটেনশান। তুমি কিছু মিস করছি --
স্টাফেন চেজেলাস

8
xargs grep -i -- foo /dev/null < files.txt

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

(unset -v IFS; set -f; grep -i -- foo $(cat files.txt))

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

এগুলি আরও ধরে নেয় যে ফাইলগুলির কোনওটিকেই ডাকা হয়নি -


এটা ভাল ব্যবহার করতে দ্রুততর / $(< file)পরিবর্তে $(cat file)অন্তত এ, bashএবং zsh
জিম্মিজ

7

স্টিডিনের ফাইলের নামের একটি তালিকা পড়তে আপনি ব্যবহার করতে পারেন xargs। যেমন,

cat files.txt | xargs -d'\n' grep -i -- 'foo'

ডিফল্টরূপে, xargsফাঁকা দ্বারা বিসীমাবদ্ধ স্ট্যান্ডার্ড ইনপুট থেকে আইটেমগুলি পড়ে। -d'\n'এটা যুক্তি বিভেদক হিসাবে সম্পর্কে newline ব্যবহার করতে তাই এটি ফাইল ঐ খালি ধারণকারী নাম সব ব্যবস্থা করতে সক্ষম বলে। (স্টাফেন চেজেলাস যেমন উল্লেখ করেছেন, এটি একটি জিএনইউ এক্সটেনশন)। তবে এটি নতুন লাইনের সমন্বিত ফাইলের নামগুলি মোকাবেলা করবে না; সেগুলি পরিচালনা করার জন্য আমাদের আরও কিছু জটিল পদ্ধতির প্রয়োজন।

এফডাব্লুআইডাব্লু, এই পদ্ধতিটি একটি while readলুপের চেয়ে কিছুটা দ্রুত , কারণ বাশের readকমান্ডটি খুব ধীর - এটি তার ডেটা চরিত্রটি অক্ষর দ্বারা xargsপাঠ করে , তবে এর ইনপুটটি আরও দক্ষতার সাথে পড়ে। এছাড়াও, প্রতিটি অনুরোধের সাথে একাধিক ফাইলের নাম প্রাপ্ত হওয়ার সাথে xargsকেবল grepকমান্ডটি যতবার প্রয়োজন ততবার ডেকে আনে এবং এটি grepপ্রতিটি ফাইলের নামের জন্য স্বতন্ত্রভাবে আহ্বানের চেয়ে আরও কার্যকর ।

দেখুন xargs man পৃষ্ঠা এবং আরও বিস্তারিত জানার জন্য xargs তথ্য পাতা।


3

xargsফাইল থেকে আইটেমগুলি পড়তে পারে (আপনার files.txtতালিকার মতো ) এর বিকল্পটি সহ:

   --arg-file=file
   -a file
          Read items from file instead of standard input.  If you use this
          option, stdin remains unchanged when commands are  run.   Other
          wise, stdin is redirected from /dev/null.

সুতরাং এটিও কাজ করা উচিত:

xargs -a files.txt grep -i 'foo'

অথবা ফাইলের নামগুলিতে ফাঁকা স্থানের জন্য

xargs -d'\n' -a files.txt grep -i 'foo'
xargs -I{} -a files.txt grep -i 'foo' {}

1

আপনি এর জন্যও কিছু করতে পারেন তবে ওরিওনের উদাহরণটি সবচেয়ে সহজ:

for i in $(cat files.txt); do grep -i 'foo' $i ; done

(ফাইলগুলিতে তালিকাভুক্ত প্রতিটি ফাইলের জন্য। টেক্সট এতে গ্রেপ কমান্ড কার্যকর করে।)

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