কিভাবে লিনাক্সে দুটি স্ট্রিং একসাথে থাকা ফাইলগুলি সন্ধান করবেন?


8

আমি একসঙ্গে দুটি স্ট্রিং ধারণকারী ফাইল খুঁজে পেতে চাই, উদাহরণস্বরূপ ফাইল উভয় রয়েছে string1 এবং string2।

আমি আউটপুট ফাইল সম্পূর্ণ পথ চান। আমি "অনুমতি অস্বীকার" সতর্কতা দেখতে চাই না।

উত্তর:


12
grep -l string2 `grep -l string1 /path/*`

যা একই হিসাবে

grep -l string2 $(grep -l string1 /path/*)

সম্পাদনা করুন grep string1 /path/* | grep string2 আমি alwbtc কি মনে করি কি না।

$ cd /tmp
$ cat a
apples
oranges
bananas
$ cat b
apples
mangoes
lemons
$ cat c
mangoes
limes
pears
$ cd ~
$ grep apples /tmp/* | grep mangoes
$

কিছুই পাওয়া যায়নি, কিন্তু ফাইল বি উভয় স্ট্রিং রয়েছে।

আমি alwbtc কি মনে হয় এখানে

$ grep -l apples $(grep -l mangoes /tmp/*)
/tmp/b

এটি একটি পরিষ্কার সমাধান এবং আমার চেয়ে আরও দরকারী। যারা এখানে জানতে চান তাদের জন্য (এটি সম্পর্কে কিছুটা চিন্তা করে নিয়েছে), সেটি ব্যবহার করছে -l লাইন পরিবর্তে ফাইল নাম ফেরত বিকল্প। তারপরে তিনি সেই লেনদেনটি পাস করতে ডলার চিহ্ন বা ব্যাক কোট ব্যবহার করছেন FILE দ্বিতীয় grep মধ্যে যুক্তি। এটি দ্বিতীয় grep আমার সমাধান হিসাবে পৃথক লাইন পরিবর্তে পাওয়া প্রতিটি ফাইল সম্পূর্ণতা অনুসন্ধান করতে পারবেন।
— embedded.kyle

আপনি একটি মিস -l উভয় কমান্ডের জন্য বিকল্প সমান বিবেচিত হবে।
— pong

2

পাইপ এক grep অন্য মধ্যে:

grep "string1" /path/to/files/* | grep "string2"


3
যদি দুটি স্ট্রিং ফাইলের বিভিন্ন লাইনগুলিতে থাকে তবে এটি কাজ করবে না।
— RedGrittyBrick

1
আমি জানি না তাদের একই লাইনে @RedGrittyBrick থাকতে হবে
— slhck

@ স্লেকঃ আমি আমার উত্তরটি হালনাগাদ করেছিলাম যা আমি মনে করি এলববটসি চায় এবং কেন এই উত্তরটি তা করে না। অবশ্যই, আমি alwbtc যা চাই তা ভুল বুঝেছি এবং এমবেডেড। কাইল এটি সঠিক বলে মনে হতে পারে - যদিও আমি সন্দেহ করি না।
— RedGrittyBrick

1

এখানে সমতুল্য কমান্ড RedGrittyBrick এর উত্তর :

ack string2 $(ack string1 -l)

একই ভাবে কাজ করে (ছাড়া ack ডিফল্টরূপে বর্তমান ডিরেক্টরি অনুসন্ধান করে)। মধ্যে বিষয়বস্তু $() জন্য অনুসন্ধান string1 কিন্তু -l আউটপুট শুধুমাত্র ফাইল নাম যেখানে যে স্ট্রিং পাওয়া যায় নি। তারপর বাইরের কমান্ডের মধ্যে আর্গুমেন্ট হিসাবে পাস করা হয়, যার অর্থ string2 শুধুমাত্র ফাইলের তালিকাগুলির মধ্যে অনুসন্ধান করা হয়।


0
comm -12 <(grep --fixed-strings --files-with-matches "STRING1" /path/to/files/* 2>/dev/null | sort) <(grep --fixed-strings --files-with-matches "STRING1" /path/to/files/* 2>/dev/null | sort)

বা কম redundantly:

search_files () { str="$1"; shift; grep -Fl "$str" "$@" 2>/dev/null | sort; }
comm -12 <(search_files "STRING1" /path/to/files/*) <(sf "STRING2" /path/to/files/*)

স্ট্রিংগুলি যদি একই ফাইলের বিভিন্ন লাইনগুলিতে থাকে তবে এটি কাজ করবে এবং যদি একটি ফাইলের নাম স্ট্রিংগুলির মধ্যে থাকে তবে মিথ্যা ইতিবাচকগুলি এড়ানো হবে।


0

@ RedGrittyBrick এর সমাধানটি সম্প্রসারিত করার জন্য যা কমান্ডটি অপ্রত্যাশিত প্লাসটি চালানোর সময় ত্রুটি আউটপুট দমন করার উদ্দেশ্যে এবং ফাইলগুলিকে পুনরাবৃত্তি করার জন্য পুনরাবৃত্তি করতে পারে তখন আপনি এটি বিবেচনা করতে পারেন

grep -l 'STRING1' $(! grep -lrs 'STRING2' /absolute/path/to/search/dir && echo /dev/null)

-s অপশন ত্রুটি বার্তা দমন করা হবে
-r অপশন ইচ্ছাকৃতভাবে nested ডিরেক্টরি মধ্যে স্ট্রিং জন্য অনুসন্ধান করতে পারবেন
! সংযুক্ত && echo /dev/null কমান্ড ঝুলানো হবে না যে গ্যারান্টি। অন্যথায়, যদি inner grep কোন ফাইল খুঁজে পাওয়া যায় না তাই এটি আউটপুট কিছু হবে না outer grep অনির্দিষ্টকালের জন্য অনুসন্ধান ইনপুট জন্য অপেক্ষা করবে। এই সমাধান আউটপুট /dev/null এই ক্ষেত্রে তাই outer grep জন্য অনুসন্ধান করা হবে STRING1 মধ্যে /dev/null যেখানে এটি কিছু খুঁজে না অনুমিত হয়।

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