কিভাবে -exec খুঁজে মিলিত কমান্ড পাস?


3

মিলিত কমান্ড পাস বৈধ সিনট্যাক্স কি find সঙ্গে -exec বিকল্প?


উদাহরণ:

find . -type f -name "*.txt" -exec grep FirstKeyWord {} | grep SecondKeyWord \;

নিম্নলিখিত ত্রুটি বার্তা সঙ্গে ব্যর্থ হয়:

find: grep: missing argument to `-exec`
;: No such file or directory

কমান্ড মিলিত হয় যখন একই ধরনের ব্যর্থতা && অথবা ; পরিবর্তে |। আমি এমনকি যৌথ কমান্ড উদ্ধৃত করার চেষ্টা করেছি 'অথবা $ () বা {} বা এরকম, কিন্তু এটি (দু: খজনক) ব্যর্থ হয়েছে।

দ্রষ্টব্য: আমি কাস্টম স্ক্রিপ্টগুলি ব্যবহার না করেই একটি এক-মাছ ধরার সমাধান খুঁজছি।


স্ট্যাক ওভারফ্লো কমিউনিটিতে, একই রকম একটি প্রশ্ন রয়েছে: stackoverflow.com/questions/5119946/...
Bludzee

সুপার ইউজার কমিউনিটির ক্ষেত্রে আরেকটি অনুরূপ প্রশ্ন: superuser.com/questions/236601/...
Bludzee

উত্তর:


3

আপনি একটি শেলটি স্পষ্টভাবে সেখানে শেল চালানোর দ্বারা কার্যকর করার জন্য একটি জটিল শেল কমান্ড ব্যবহার করতে পারেন।

find . -type f -name "*.txt" -exec sh -c 'grep FirstKeyWord "$1" | grep SecondKeyWord' -- {} \;

এই executes sh প্রতিটি ফাইলের জন্য প্রদত্ত কমান্ড তালিকা দিয়ে, ফাইলের নাম পাশ করে $1

সম্পাদনা করুন: ওপি নির্দেশ করে যে এটি কাজ করে এবং সহজ:

find . -type f -name "*.txt" -exec sh -c 'grep FirstKeyWord {} | grep SecondKeyWord' \;

2

আপনার নির্দিষ্ট উদাহরণের জন্য, আপনি এটি করতে পারেন:

find . -type f -name "*.txt" -exec grep FirstKeyWord {} \; | grep "SecondKeyWord"

BTW, এটি একটি দ্বিতীয় grep ব্যবহার ছাড়াও করা যাবে। পরিবর্তে, ব্যবহার করুন egrep দুই বিকল্প সঙ্গে FirstKeyWord অনুসরণ করে SecondKeyWord অথবা SecondKeyWord অনুসরণ করে FirstKeyWord:

find . -type f -name "*.txt" -exec egrep "FirstKeyWord.*SecondKeyWord|SecondKeyWord.*FirstKeyWord" {} \;

আপনি থেকে ফলে pathnames সম্পর্কে কিছু গ্যারান্টি করতে পারেন find (কোন নেতৃস্থানীয় বা অভ্যন্তরীণ স্পেস এবং পাথনামগুলিতে কোন নতুন তালিকা নেই), আপনি এটি এভাবেও করতে পারেন:

find . -type f -name "*.txt" -print | while read filename; do grep "FirstKeyWord" "${filename}" | grep "SecondKeyWord"; done

আরো সাধারণ উত্তর "আপনি না" সরাসরি থেকে find। পাইপিং আদেশ বা ব্যবহার && অথবা || শেলের একটি ফাংশন, কার্য সম্পাদন প্রক্রিয়াগুলির একটি ফাংশন নয়।

আমি আগে এই প্যাটার্ন ব্যবহার করেছি, কিন্তু এটি ভঙ্গুর এবং আরো জটিল:

find . -type f -name "*.txt" -print \
    | sed -e 's;[\\$"`!];\\&;g' \
          -e 's;^.*$;grep "FirstKeyWord" "&" | grep "SecondKeyWord";' \
    | sh

প্রতিটি ফাইলের নাম মুদ্রণ করুন, ব্যবহার করুন sed ফ্লাইতে এটি একটি শেল স্ক্রিপ্টে রূপান্তরিত করতে (ফাইল নামতে অক্ষরগুলি এড়িয়ে যাওয়ার সতর্কতা অবলম্বন করে যা শেল ডাবল-কোটগুলিতে আবদ্ধ হলে সমস্যার কারণ হতে পারে), তারপরে শেলের মাধ্যমে ফলাফলটি চালান।

অন্য সমাধান হল একটি শেল স্ক্রিপ্ট তৈরি করা যা আপনার প্রক্রিয়াকরণ করে এবং যে শেল স্ক্রিপ্টটিকে খুঁজে বের করে:

$ cat grepit.sh
#!/bin/sh
grep "FirstKeyWord" "$1" | grep "SecondKeyWord"
$ find . -type f -name "*.txt" -exec sh grepit.sh {} \;

আপনার উদাহরণের উত্তরে, যদি ফাইলের নামের মধ্যে "সেকেন্ডকিয়ার্ড" থাকে কিন্তু ফাইলের বিষয়বস্তু না থাকে তবে লাইনটি রাখা হবে তবে এটি ফিল্টার করা উচিত।
Bludzee

আমি সত্যিই দ্বিতীয় কমান্ড হতে হবে মিলিত প্রথম কমান্ডে যাতে তারা এক এবং একক-এক্সেক প্যারামিটার হয়ে যায়।
Bludzee

এই নির্দিষ্ট উদাহরণের জন্য শুধুমাত্র একটি workaround হয়। আমি জানতে চাই যে জটিল (= মিলিত) কমান্ডগুলি কিভাবে -exec খুঁজে বের করতে হবে, শুধুমাত্র প্রশ্ন থেকে উদাহরণটি ব্যবহার করতে হবে না।
Bludzee

সাধারণ প্রশ্নের উত্তর দিতে সম্পাদনা করুন: আপনি করতে পারবেন না; সরাসরি থেকে না find
J Earls

0

"-Exec" ব্যবহার অত্যন্ত হতাশ, কারণ এটি অনেক উপ-প্রক্রিয়া তৈরি করে।

"Xargs" দিয়ে "সন্ধান করুন" ব্যবহার করে বিবেচনা করুন ("-প্রিন্ট0" এবং "-0" ব্যবহার করে)

find . -type f -name "*.txt" -print0 | xargs -0 grep FirstKeyWord | grep SecondKeyWord

এর সাথে, "grep" অনেকগুলি ফাইলের জন্য একবার একবার তৈরি হয় (একটি প্রোগ্রাম থাকতে পারে এমন আর্গুমেন্টের সীমা পর্যন্ত)।


ব্যবহার xargs উদাহরণের জন্য একটি ভাল ধারণা, কিন্তু প্রশ্ন সম্পর্কে find সঙ্গে -exec। বিটিডব্লিউ, আপনি একটি রেফারেন্স ওয়েবসাইট ভাগ করতে পারেন যেখানে এটি ব্যাখ্যা করা হচ্ছে কেন "-exec" ব্যবহার করা হচ্ছে "অত্যন্ত নিরুৎসাহিত করা" (সম্ভবত একটি অত্যধিকতা)?
Bludzee

শুধু নিজের দ্বারা পার্থক্য পরীক্ষা। আমি বিভিন্ন ডিরেক্টরি 407 শেল স্ক্রিপ্ট আছে। জন্য 17 সেকেন্ড: খুঁজে ' .sh '-exec grep' ^ # '' {} ''; ' ### কিন্তু খুঁজে পাওয়ার জন্য 3 সেকেন্ড ' .sh '-print0 | xargs -0 grep '# ^'
Vouze

1
এর পরিবর্তে + এর পরিবর্তে \; একাধিক প্যারামিটার হ্যান্ডেল করতে একইভাবে xargs সঞ্চালন; উপ-প্রসেসের বিস্তারের সাথে সাধারণ ক্ষেত্রে মৃত্যুদণ্ড কার্যকর করার কোন প্রয়োজন নেই।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.