আমি কীভাবে পাইপ অন্তর্ভুক্ত করব | আমার লিনাক্স-এক্সেক কমান্ডে?


220

এটি কাজ করছে না এটি কি অনুসন্ধানে করা যায়? বা আমার কি জার্গস করা দরকার?

find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;

উত্তর:


144

একাধিক প্রক্রিয়া চালনার নির্দেশ হিসাবে পাইপ প্রতীককে ব্যাখ্যা করার কাজ এবং একটি প্রক্রিয়ার আউটপুটকে অন্য প্রক্রিয়াটির ইনপুটটিতে পাইপ দেওয়ার শেল (/ বিন / শ বা সমমান) এর দায়িত্ব 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'

... যার সন্ধানের জন্য একটি অনুরোধ, এক্সার্গের একটি অনুরোধ, জেডকেটের কয়েকটি অনুরোধ এবং একাধিক কৃষিগ্রহের জন্য অনুরোধ রয়েছে।


1
Xargs এর আরেকটি সুবিধা হ'ল আপনি -P সুইচ (-P 0) ব্যবহার করে আধুনিক মাল্টি কোর সিপু দিয়ে আরও গতি অর্জন করতে পারেন।
ফ্লোলো

হ্যাঁ, পি-সুইচ সাধারণভাবে কার্যকর করার গতি বাড়ানোর এক দুর্দান্ত উপায়। দুর্ভাগ্যক্রমে, আপনি সমান্তরাল জ্যাক্যাট প্রসেসগুলির আউটপুট ঝুঁকিপূর্ণভাবে চালিয়ে যাচ্ছেন এগ্রিপ ইন্টারলিভারে পাইপ করা যা ফলাফলকে প্রভাবিত করে। এই প্রভাবটি প্রদর্শিত হতে পারে: প্রতিধ্বনি "1 \ n2" | ব্যবহার করে using xargs -P 0 -n 1 হ্যাঁ | ইউনিক
রল্ফ ডাব্লু। রাসমুসেন

@ অ্যাডাম, আমি আপনার প্রস্তাবিত পরিবর্তন করেছি।
পল টমবলিন

যার জন্য আপনি চমত্কার xjobs কমান্ড (সোলারিস থেকে মূলত) ইনস্টল করতে পারেন
sehe

4
একটি সহজ এবং আরও সাধারণ উত্তর স্ট্যাকওভারফ্লো-exec sh -c "… | … " \; . com / a/ 21825690 / 42973 : এ রয়েছে ।
এরিক হে লেবিগোট

277

সমাধানটি সহজ: sh এর মাধ্যমে এক্সিকিউট করুন

... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;

17
ওপি যা অর্জন করতে চাইছিল তা উপরের পরামর্শগুলির সাথে পূরণ করা যেতে পারে, তবে এটিই যা আসলে জিজ্ঞাসিত প্রশ্নের উত্তর দেয়। এটি এইভাবে করার কারণ রয়েছে - এক্সিকিউট সন্ধানের মাধ্যমে ফিরে আসা ফাইলগুলিতে অপারেটিংয়ের চেয়ে অনেক বেশি শক্তিশালী, বিশেষত পরীক্ষার সাথে মিলিত হওয়ার পরে। উদাহরণস্বরূপ: geda-gaf / -type d -exec bash -c 'DIR = {}; [[$ (সন্ধান করুন ডিআইআর-ম্যাক্সডেপথ ১ | এক্সার্গস গ্রেপ-আই মশলা
মশালার

3
সর্বোত্তম উত্তর. পুরো আউটপুটকে গ্রিপিং করা (অন্যান্য উত্তরগুলির মতামত হিসাবে) প্রতিটি ফাইল গ্রেপ করার মতো নয়। টিপ: sh এর পরিবর্তে আপনি চাইলে অন্য যে কোনও শেল ব্যবহার করতে পারেন (আমি চেষ্টা করেছি এটি ব্যাশের সাথে এবং এটি ঠিক চলছে)।
প্যাগলিউচ

1
-cবিকল্পটি উপেক্ষা না করার বিষয়টি নিশ্চিত করুন । অন্যথায় আপনি একটি ধাঁধা No such file or directoryত্রুটি বার্তা পাবেন।
asmaier

এখানে একটি দুর্দান্ত পিএস প্রতিস্থাপন যা একটি এক্সিকিউড শেলের ভিতরে পাইপিংয়ের সাহায্যে অনুসন্ধানটি ব্যবহার করে: / usr / bin / find / proc -mindepth 1 -maxdepth 1 -type d -regex '। * / [0-9] +' - মুদ্রণ-এক্সেক বাশ -c "বিড়াল {} / সেমিডলাইন | ট্র '\\ 0' ''; প্রতিধ্বনি" \;
সমতা

1
ফাইল খুঁজে পেতে এবং তাদের সাথে পুনঃনামকরনের উদাহরণ SED রেগুলার এক্সপ্রেশন ব্যবহার find -type f -name '*.mdds' -exec sh -c "echo {} | sed -e 's/_[0-9]\+//g' | xargs mv {}" \;
Rostfrei

16
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'

দক্ষতার কারণে-প্রিন্ট এবং জার্গস এড়ানোর প্রত্যাশা। সম্ভবত
এটিই

এটি তাদের নামে ফাঁকা ফাইলগুলির সাথে কাজ করে না; ঠিক করতে, -প্রিন্ট -0-এর সাথে -প্রিন্ট প্রতিস্থাপন এবং xargs -0 বিকল্প যুক্ত করতে
অ্যাডাম রোজেনফিল্ড

2
@ সোমেগুই - ওয়া? দক্ষতার কারণে xargs এড়ানো? Zcat এর একটি উদাহরণ কল করা এবং এটি একাধিক ফাইলের তালিকা পাস করা প্রতিটি পাওয়া ফাইলের জন্য এটির একটি নতুন উদাহরণ নির্বাহের চেয়ে অনেক বেশি কার্যকর।
শেরম পেন্ডলি

@ অ্যাডাম - আমি আপনার প্রস্তাবিত পরিবর্তন করেছি। 99% সময় যখন আমি সন্ধান করি তখন এটি আমার উত্স কোড ডিরেক্টরিগুলিতে থাকে এবং সেখানকার কোনও ফাইলে স্পেস থাকে না তাই আমি মুদ্রণ0 নিয়ে বিরক্ত করি না। এখন আমার ডকুমেন্ট ডিরেক্টরি, অন্যদিকে, আমি মুদ্রণ0 মনে রাখি।
পল টমলিন

10

এছাড়াও আপনি একটি জন্য পাইপ পারেন 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় করে তুলছে না তাই ম্যাচ করা ক্লাসের নাম দেখতে আপনাকে আউটপুটটিতে কিছুটা কাছাকাছি দেখতে হবে। দেখা যাচ্ছে যে উইন্ডোজ 'ফর' কমান্ড বেশ কয়েকটি কৌশল জানে যেমন টেক্সট ফাইলগুলির মাধ্যমে লুপিং ...

উপভোগ


2

আমি দেখতে পেয়েছি যে স্ট্রিং শেল কমান্ড (sh -c) চালানো সবচেয়ে ভাল কাজ করে, উদাহরণস্বরূপ:

find -name 'file_*' -follow -type f -exec bash -c "zcat \"{}\" | agrep -dEOE 'grep'" \;

0

আপনি যদি কোনও সাধারণ বিকল্পের সন্ধান করছেন তবে এটি একটি লুপ ব্যবহার করে করা যেতে পারে:

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 দ্বারা যে কোনও {} প্রতিস্থাপন করুন

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