এক্স-এক্সইসি এবং এখনও কোনও ফাইলে আউটপুট ব্যবহার করে আমি কীভাবে FIND এর ফলাফলগুলি গ্রেপ করতে পারি?


64

উদাহরণগুলিতে ব্যাখ্যা করা ভাল।

আমি পারি:

find . -name "*.py" -type f > output.txt

তবে আমি কীভাবে একই ফাইলটিতে আউটপুট সংরক্ষণ করতে পারি:

find . -name "*.py" -type f -exec grep "something" {} \

আমি শুধু করতে পারি না

find . -name "*.py" -type f -exec grep "something" {} \ > output.txt

উত্তর:


105

যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি যা করতে চান এটি:

find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt

Findএক্সটেনশানের সঙ্গে সব ফাইল py, grepশুধুমাত্র সারি যেগুলিতে somethingএবং সারি সংরক্ষণ output.txt। যদি ফাইলটিতে কিছু থাকে তবে এটি প্রতিস্থাপন করা হবে।

সম্পাদনা: এক্সেক্স ব্যবহার করে:

find . -name '*.py' -exec grep 'something' {} \; > output.txt

আমি ক্রিস ডাউনস মন্তব্যটি এখানে যুক্ত করছি। উপরের কমান্ডটি উপস্থিতি grepহিসাবে যতবার নির্বাহ করা হবে তার ফলস্বরূপ find। যাইহোক, যদি আপনি প্রতিস্থাপন ;একটি সঙ্গে +, grepথেকে আউটপুট বলা হয় findঘনিভূত (আপ একটি নির্দিষ্ট সীমা)। প্রশ্ন দেখতে পাবেন সেমিকোলন ব্যবহার (;) বনাম খুঁজুন Exec সঙ্গে প্লাস (+ +) বিষয় সম্পর্কে আরো জানার জন্য।


16
+পরিবর্তে ব্যবহার করুন \;, এটি কার্যকরভাবে কার্যকর করার সময়টিকে উল্লেখযোগ্যভাবে উন্নত করবে (যেহেতু এটি কার্যকর হওয়ার আগে পর্যন্ত কার্যনির্বাহী যুক্তিগুলির বিরুদ্ধে তুলনা করে ARG_MAX)।
ক্রিস ডাউন

আমি এখন জার্গার্সের শক্তি বুঝতে পারি! ধন্যবাদ!
domih

4
grep -Hআপনি যদি আউটপুটে ফাইলের ফাইলের নাম অন্তর্ভুক্ত করতে চান তবে ব্যবহার করুন ।
স্টেইনার

18

আপনি যদি সমস্ত ফাইলের মধ্যে সমস্ত মিলে যাওয়া লাইনগুলি সংরক্ষণ করতে চান তবে output.txtআপনার শেষ কমান্ডটি কাজ করবে, ব্যতীত আপনি ;কমান্ডের শেষে প্রয়োজনীয়টি মিস করছেন ।

find . -name "*.py" -type f -exec grep "something" {} \; > output.txt

আপনি যদি প্রতিটি রান grepআলাদা আলাদা ফাইলে আউটপুট তৈরি করতে চান তবে আউটপুট ফাইলের নাম গণনা করার জন্য একটি শেল চালান এবং পুনঃনির্দেশ সম্পাদন করুন।

find . -name "*.py" -type f -exec sh -c 'grep "something" <"$0" >"$0.txt"' {} \;

শেষটি সত্যিই দুর্দান্ত: ডি
বাকিট্ন

@ গিলিস জবাবটি আরও কিছুটা তথ্যবহুল করার জন্য প্রসারিত করার জন্য, বিশেষ করে যদি আপনি যে ফাইলগুলির সাথে কাজ করছেন তার তালিকা বড় হয়, আপনি এটি ব্যবহার করে গ্রেপ'এর ফলাফলের সাথে প্রতিটি ফাইলের ফাইলের নাম (আপেক্ষিক পথ) প্রতিবেদন করতে পারেন : find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt এবং যদি আপনি গ্রেপড রেখার লাইন নম্বর দেখতে চান তবে অবশ্যই আপনি ব্যবহার করতে পারেনgrep -n "something"
জেজেএমপিএলস

9

রেকর্ডের জন্য, grepহয়েছে --includeএবং --excludeযুক্তি হল যে আপনি ফাইল এটা অনুসন্ধান করে ফিল্টার করতে ব্যবহার করতে পারেন:

grep -r --include="*.py" "something" > output.txt

2
কমপক্ষে জিএনইউ grepকরে।
phk

2

ব্যবহার tee:

find . -name '*.py' | tee output.txt | xargs grep 'something'

সতর্কীকরণ, আপনি (ফাঁকা জায়গা সমেত) বিশেষ অক্ষর কোন ফাইল আছে যদি যে xargsএবং grepসাথে ভাল কাজ করবে না ( a file.txtদুটি ফাইলের হিসেবে ব্যাখ্যা করা হবে, aএবং file.txt)। এর বিকল্পটি হ'ল হয় -xবা ব্যবহার করা -print0, তবে সেগুলির কোনওটিই আপনার দূষিত করবে output.txt-xব্যবহার করবে \নির্দিষ্ট বিশেষ অক্ষর অব্যাহতি এবং এই মধ্যে হতে হবে output.txt-print0একটি ক্ষেত্র বিভাজক হিসেবে নাল বাইট ব্যবহার করবে (এটিও প্রয়োজন xargs -0) এবং output.txtলেখার এক দীর্ঘ সংলগ্ন লাইন দেখতে কেমন হবে।

আপনি এর সাথে কীভাবে व्यवहार করেন (বা করবেন না) এটি আপনার উপর নির্ভর করে।

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