উত্তর:
একাধিক প্রক্রিয়া চালনার নির্দেশ হিসাবে পাইপ প্রতীককে ব্যাখ্যা করার কাজ এবং একটি প্রক্রিয়ার আউটপুটকে অন্য প্রক্রিয়াটির ইনপুটটিতে পাইপ দেওয়ার শেল (/ বিন / শ বা সমমান) এর দায়িত্ব is
উদাহরণস্বরূপ আপনি পাইপিং সম্পাদন করতে আপনার শীর্ষ স্তরের শেলটি বেছে নিতে বেছে নিতে পারেন:
find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'
দক্ষতার দিক থেকে এই ফলাফলগুলির জন্য অনুসন্ধানের একটি অনুরোধ, জেকেটের অসংখ্য আহ্বান এবং একটি কৃষির অনুরোধের জন্য ব্যয় হয়।
এর ফলে কেবলমাত্র একক অগ্রণী প্রক্রিয়া তৈরি হবে যা জেকেট এর অসংখ্য আহ্বান দ্বারা উত্পাদিত সমস্ত আউটপুট প্রক্রিয়া করবে।
আপনি যদি কোনও কারণে একাধিকবার কৃষিগ্রাহ আহ্বান করতে চান তবে আপনি এটি করতে পারেন:
find . -name 'file_*' -follow -type f \
-printf "zcat %p | agrep -dEOE 'grep'\n" | sh
এটি কার্যকর করার জন্য পাইপ ব্যবহার করে কমান্ডের একটি তালিকা তৈরি করে, তারপরে এগুলি বাস্তবায়িত হওয়ার জন্য একটি নতুন শেলের কাছে প্রেরণ করে। (চূড়ান্ত "| sh" ছাড়াই কমান্ড লাইনের শুকনো রানগুলি ডিবাগ করা বা সম্পাদন করার একটি দুর্দান্ত উপায়))
দক্ষতার দিক থেকে এই ফলাফলগুলির জন্য অনুসন্ধানের একটি অনুরোধ, শ এর একটি অনুরোধ, জেকেটের অসংখ্য আহ্বান এবং অগ্রাধিকারের অসংখ্য আহ্বান ব্যয় হয়।
কমান্ড আহ্বানের সংখ্যার ক্ষেত্রে সবচেয়ে কার্যকর সমাধান হ'ল পল টম্বলিনের পরামর্শ:
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
... যার সন্ধানের জন্য একটি অনুরোধ, এক্সার্গের একটি অনুরোধ, জেডকেটের কয়েকটি অনুরোধ এবং একাধিক কৃষিগ্রহের জন্য অনুরোধ রয়েছে।
-exec sh -c "… | … " \;
. com / a/ 21825690 / 42973 : এ রয়েছে ।
সমাধানটি সহজ: sh এর মাধ্যমে এক্সিকিউট করুন
... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;
-c
বিকল্পটি উপেক্ষা না করার বিষয়টি নিশ্চিত করুন । অন্যথায় আপনি একটি ধাঁধা No such file or directory
ত্রুটি বার্তা পাবেন।
find -type f -name '*.mdds' -exec sh -c "echo {} | sed -e 's/_[0-9]\+//g' | xargs mv {}" \;
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
এছাড়াও আপনি একটি জন্য পাইপ পারেন while
লুপ যে ফাইল যা একাধিক কর্ম করতে পারি না find
অবস্থান নির্ণয় করে। তাই এখানে তাকিয়ে জন্য এক jar
বৃহৎ ডিস্ট্রো সঙ্গে ফোল্ডারে একটি প্রদত্ত জাভা ক্লাস ফাইল জন্য আর্কাইভ jar
ফাইল
find /usr/lib/eclipse/plugins -type f -name \*.jar | while read jar; do echo $jar; jar tf $jar | fgrep IObservableList ; done
মূল পয়েন্টটি হ'ল while
লুপটিতে একাধিক কমান্ড রয়েছে যা সেমিকোলন দ্বারা পৃথক পৃথক পৃথক পৃথক ফাইলের নাম উল্লেখ করে এবং এই কমান্ডগুলিতে পাইপ অন্তর্ভুক্ত থাকতে পারে। সুতরাং সেই উদাহরণে আমি মিলে যাওয়া ফাইলটির নামটি প্রতিধ্বনিত করে তারপরে কোনও প্রদত্ত শ্রেণীর নামের জন্য সংরক্ষণাগার ফিল্টারিংয়ে কী আছে তা তালিকাবদ্ধ করি। আউটপুটটি দেখে মনে হচ্ছে:
। জার সংস্থা / অন্ধকার / কোর / databinding / পর্যবেক্ষণযোগ্য / তালিকা / IObservableList .class /usr/lib/eclipse/plugins/org.eclipse.search.source_3.5.1.r351_v20090708-0800.jar / usr / lib / অন্ধকার / plugins / এখানে org.eclipse.jdt.apt.core.source_3.3.202.R35x_v20091130-2300.jar /usr/lib/eclipse/plugins/org.eclipse.cvs.source_1.0.400.v201002111343.jar / usr / lib / elipse / plugins / org.eclipse.help.appserver_3.1.400.v20090429_1800.jar
আমার বাশ শেলের (xubuntu10.04 / xfce) এটি ম্যাচ করা fgrep
স্ট্রিংয়ের সাথে হ'ল মেলে এমন স্ট্রিং হিসাবে মিলিয়ে ক্লাসের নামটি সত্যিই সাহসী করে তোলে ; এটি jar
অনুসন্ধান করা শতাধিক ফাইলের তালিকা খুব সহজেই সহজে স্ক্যান করে ফেলে এবং সহজেই কোনও মিল খুঁজে পায়।
উইন্ডোজ এ আপনি একই জিনিস করতে পারেন:
for /R %j in (*.jar) do @echo %j & @jar tf %j | findstr IObservableList
নোট করুন যে উইন্ডোজে কমান্ড বিভাজকটি '&' নয় ';' এবং '@' লিনাক্সের উপরের আউটপুটটি খুঁজে পাওয়ার মতো একটি পরিপাটি আউটপুট দেওয়ার কমান্ডের প্রতিধ্বনিকে দমন করে; যদিও findstr
ম্যাচিং স্ট্রিংকে গা bold় করে তুলছে না তাই ম্যাচ করা ক্লাসের নাম দেখতে আপনাকে আউটপুটটিতে কিছুটা কাছাকাছি দেখতে হবে। দেখা যাচ্ছে যে উইন্ডোজ 'ফর' কমান্ড বেশ কয়েকটি কৌশল জানে যেমন টেক্সট ফাইলগুলির মাধ্যমে লুপিং ...
উপভোগ
আমি দেখতে পেয়েছি যে স্ট্রিং শেল কমান্ড (sh -c) চালানো সবচেয়ে ভাল কাজ করে, উদাহরণস্বরূপ:
find -name 'file_*' -follow -type f -exec bash -c "zcat \"{}\" | agrep -dEOE 'grep'" \;
আপনি যদি কোনও সাধারণ বিকল্পের সন্ধান করছেন তবে এটি একটি লুপ ব্যবহার করে করা যেতে পারে:
for i in $(find -name 'file_*' -follow -type f);do zcat $i | agrep -dEOE 'grep');done
বা, আরও সাধারণ এবং বোঝার জন্য সহজ ফর্ম:
for i in $(YOUR_FIND_COMMAND);do YOUR_EXEC_COMMAND_AND_PIPES );done
এবং YOUR_EXEC_COMMAND_AND_PIPES এ any i দ্বারা যে কোনও {} প্রতিস্থাপন করুন