আমি একটি করছি find
এবং তারপরে ফাইলগুলির একটি তালিকা পাচ্ছি । আমি কীভাবে এটিকে অন্য কোনও ইউটিলিটিতে পাইপ করব cat
(যাতে বিড়াল those সমস্ত ফাইলের বিষয়বস্তু প্রদর্শন করে) এবং মূলত grep
এই ফাইলগুলি থেকে কোনও কিছুর প্রয়োজন হয় ।
আমি একটি করছি find
এবং তারপরে ফাইলগুলির একটি তালিকা পাচ্ছি । আমি কীভাবে এটিকে অন্য কোনও ইউটিলিটিতে পাইপ করব cat
(যাতে বিড়াল those সমস্ত ফাইলের বিষয়বস্তু প্রদর্শন করে) এবং মূলত grep
এই ফাইলগুলি থেকে কোনও কিছুর প্রয়োজন হয় ।
উত্তর:
অন্য প্রক্রিয়াতে পাইপিং করা (যদিও আপনি যা বলেছিলেন সেটি করার চেষ্টাটি এটি সফল করবে না):
command1 | command2
এটি কমান্ড 2 এর ইনপুট হিসাবে কমান্ড 1 এর আউটপুট প্রেরণ করবে
-exec
উপর একটি find
(এটি আপনি যা করতে চান তা করবে - তবে এটি নির্দিষ্ট find
)
find . -name '*.foo' -exec cat {} \;
(এর মধ্যে find
এবং -exec
এর মধ্যবর্তী সবকিছুই পূর্বাভাস দেয় আপনি ইতিমধ্যে ব্যবহার করছেন। {}
আপনি যে বিশেষ ফাইলটি কমান্ডের মধ্যে খুঁজে পেয়েছেন তা প্রতিস্থাপন করবে ( cat {}
এই ক্ষেত্রে); কমান্ডটি \;
শেষ করা হবে is -exec
)
কমান্ড লাইন আর্গুমেন্ট হিসাবে অন্য প্রক্রিয়াতে একটি প্রক্রিয়ার আউটপুট প্রেরণ করুন
command2 `command1`
উদাহরণ স্বরূপ:
cat `find . -name '*.foo' -print`
(উল্লেখ্য এই ব্যাক-উদ্ধৃতি নিয়মিত কোট (আমার কীবোর্ডে টিল্ড ~ অধীনে) হয়।) এই আউটপুট পাঠাব command1
মধ্যে command2
কমান্ড লাইন আর্গুমেন্ট হিসাবে। নোট করুন যে স্পেস (নিউলাইনস, ইত্যাদি) সম্বলিত ফাইলের নামগুলি পৃথক যুক্তিতে বিভক্ত হবে।
find
আপনাকে লেখার অনুমতি দেয়: find . -name '*.foo' -exec cat {} +
যেখানে এটি +
নির্দেশ করে যে find
একক কমান্ডের অনুরোধে যতগুলি ফাইলের নাম যথাযথভাবে গ্রুপ করা উচিত। এটি পুরোপুরি দরকারী (এটা অবলম্বন না ফাইলের নাম মধ্যে শূণ্যস্থান ইত্যাদি সঙ্গে পুলিশ -print0
এবং xargs -0
)।
find . -name '*.foo' | xargs cat
find . -name '*.foo' | xargs cat | grep string
POSIX 2008 +
চিহ্নিতকারীকে যুক্ত করেছে find
যার অর্থ এটি এখন স্বয়ংক্রিয়ভাবে একটি ফাইলকে একক কমান্ড প্রয়োগের জন্য যুক্তিসঙ্গত হিসাবে অনেকগুলি গ্রুপ xargs
করে, অনেকটা পছন্দ করে, তবে বেশ কয়েকটি সুবিধা সহ:
ফাইলের নাম সমস্যার সাথে একটি সমস্যা xargs
ছাড়া -0
বিকল্প, এবং ইস্যু 'এমনকি শূন্য ফাইলের নাম দিয়ে চালানো' সহ বা ছাড়া একটি সমস্যা -0
বিকল্প - কিন্তু গনুহ xargs
হয়েছে -r
বা --no-run-if-empty
যে ঘটনাকেই প্রতিরোধ করার অপশন। এছাড়াও, এই নোটেশনটি প্রক্রিয়াগুলির সংখ্যাকে হ্রাস করে, আপনি পারফরম্যান্সের পার্থক্যটি পরিমাপ করার সম্ভাবনা নেই। সুতরাং, আপনি সংবেদনশীলভাবে লিখতে পারেন:
find . -exec grep something {} +
find . -print | xargs grep something
আপনি লিনাক্স গেছেন অথবা গনুহ থাকে find
এবং xargs
কমান্ড, তারপর ব্যবহার -print0
সঙ্গে find
এবং -0
সঙ্গে xargs
হ্যান্ডেল ফাইল স্পেস এবং অন্যান্য বিজোড় বল অক্ষর ধারণকারী নামের।
find . -print0 | xargs -0 grep something
grep
আপনি যদি ফাইলের নামগুলি না চান (কেবলমাত্র পাঠ্য) তবে একটি উপযুক্ত বিকল্প যুক্ত করুন grep
(সাধারণত -h
'শিরোনামগুলি দমন করতে')। একেবারে গ্যারান্টি ফাইল নামে ছাপা হয় grep
(এমনকি যদি শুধুমাত্র একটি ফাইল পাওয়া যায় নাই কিংবা শেষ আবাহন grep
মাত্র 1 ফাইলের নাম দেওয়া হয়), তারপর যোগ /dev/null
করার xargs
কমান্ড লাইন, যাতে সবসময় অন্তত দুই ফাইলের নাম হতে হবে।
xargs grep something
।
find
স্ট্যান্ডার্ড ইনপুটটিতে পাইপ করা হয় xargs
। xargs
প্রোগ্রাম তার মান ইনপুট সার্চ, সাদা স্থান এ ইনপুট বিভাজন (ঐ খালি, নতুন লাইন, ট্যাব, ইত্যাদি) এবং কমান্ড শব্দের একটি সংখ্যা appends grep something
এবং কমান্ড লাইন সঞ্চালন করে। xargs
তারপরে ইনপুটটি শেষ না হওয়া অবধি ইনপুট পড়া এবং চালানো কমান্ডগুলি চালিয়ে যায়। প্রদত্ত ইনপুটটির জন্য যতবার প্রয়োজন ততবার কমান্ড xargs
চালায় grep
( find
এই উদাহরণ থেকে)।
/dev/null
ত্রুটি বার্তা হারাতে পুনঃনির্দেশ করা হচ্ছে ।
find
কমান্ড দ্বারা ফিরিয়ে দেওয়া ফাইলগুলির তালিকা কমান্ডের কাছে পাঠানোর কয়েকটি উপায় রয়েছে cat
, যদিও প্রযুক্তিগতভাবে সমস্ত পাইপ ব্যবহার করে না, এবং আসলে কোনও পাইপই সরাসরি ব্যবহার করে না cat
।
ব্যাকটিক্স ( `
) ব্যবহার করা সহজ :
cat `find [whatever]`
এটি আউটপুট নেয় find
এবং কার্যকরভাবে এটির কমান্ড লাইনে রাখে cat
। find
খুব বেশি আউটপুট (কমান্ড-লাইনে ফিট করার চেয়ে বেশি) বা আউটপুটে বিশেষ অক্ষর (স্পেসের মতো) থাকলে এটি ভাল কাজ করে না ।
কয়েকটি শেল সহ bash
, $()
ব্যাকটিকগুলির পরিবর্তে কেউ ব্যবহার করতে পারেন :
cat $(find [whatever])
এটি কম পোর্টেবল, তবে বাসা বাঁধে। এটি বাদ দিয়ে, এতে ব্যাকটিক্সের মতো একইরকম ক্যাভ্যাট রয়েছে।
যেটি পাওয়া গেছে তার উপরে অন্যান্য কমান্ড চালানো একটি সাধারণ ব্যবহার find
, এটি সন্ধান করে এমন একটি -exec
ক্রিয়া রয়েছে যা প্রতিটি ফাইলের জন্য এটি একটি আদেশ প্রয়োগ করে:
find [whatever] -exec cat {} \;
{}
এটি ফাইলের নামের জন্য একটি স্থানধারক এবং \;
কমান্ডের শেষ চিহ্ন চিহ্নিত করে (এর পরে অন্যান্য ক্রিয়াও করা সম্ভব -exec
))
এটি একাধিক ফাইলের নাম পাস করার cat
একক দৃষ্টান্ত চালানোর পরিবর্তে প্রতিটি একক ফাইলের জন্য একবার চলবে cat
যা অযোগ্য হতে পারে এবং কিছু আদেশের জন্য আপনার পছন্দসই আচরণ নাও করতে পারে (যদিও এটি ভাল cat
)। সিনট্যাক্সটি টাইপ করার জন্যও একটি বিশ্রী - আপনার সেমিকোলনটি এড়াতে হবে কারণ সেমিকোলন শেলের জন্য বিশেষ is
কয়েকটি সংস্করণ find
(সবচেয়ে উল্লেখযোগ্যভাবে জিএনইউ সংস্করণ) আপনাকে এর কম সংখ্যক দৃষ্টান্ত চালানোর জন্য অ্যাপেনড মোড ব্যবহার করে প্রতিস্থাপন ;
করতে +
দেয় :-exec
cat
find [whatever] -exec cat {} +
এটি প্রতিটি অনুরোধে একাধিক ফাইলের নাম পাস করবে cat
, যা আরও কার্যকর হতে পারে।
মনে রাখবেন যে তবে এটি একটি একক অনুরোধ ব্যবহারের গ্যারান্টিযুক্ত নয় । কমান্ড লাইনটি যদি দীর্ঘ হয় তবে আর্গুমেন্টগুলি একাধিক অনুরোধে ছড়িয়ে পড়ে cat
। জন্য cat
এটি সম্ভবত একটি বড় চুক্তি হয় না, কিন্তু অন্য কিছু কমান্ড এই অবাঞ্ছিত উপায়ে আচরণ পরিবর্তন হতে পারে। লিনাক্স সিস্টেমে কমান্ড লাইনের দৈর্ঘ্য সীমাটি বেশ বড়, তাই অন্য কয়েকটি ওএসের তুলনায় একাধিক প্রার্থনায় বিভক্ত হওয়া খুব বিরল।
ক্লাসিক / বহনযোগ্য পন্থাটি ব্যবহার করা হল xargs
:
find [whatever] | xargs cat
xargs
সুনির্দিষ্ট কমান্ডটি চালায় ( cat
এই ক্ষেত্রে), এবং স্ট্ডিনের কাছ থেকে এটি কী পড়বে তার ভিত্তিতে যুক্তি যুক্ত করে। শুধু -exec
সঙ্গে +
, এই পর্যন্ত কম্যান্ড-লাইন প্রয়োজনে ভঙ্গ করবে। এটি যদি find
খুব বেশি আউটপুট উত্পাদন করে তবে এটি cat
একাধিকবার চলবে । আগে যেমন বিভাগে উল্লেখ করা হয়েছে -exec
, কিছু আদেশ রয়েছে যেখানে এই বিভাজনের ফলে বিভিন্ন আচরণ হতে পারে in নোট করুন যে এর xargs
মতো ব্যবহারের ক্ষেত্রে ফাইলনামে ফাঁকা জায়গাগুলির সমস্যা রয়েছে xargs
ঠিক যেমন একটি ডিলিমিটার হিসাবে শ্বেত স্পেস ব্যবহার করে।
সর্বাধিক শক্তিশালী, বহনযোগ্য এবং দক্ষ পদ্ধতিটিও ব্যবহার করে xargs
:
find [whatever] -print0 | xargs -0 cat
-print0
পতাকা বলে find
ব্যবহার করতে \0
(নাল চরিত্র) বিভেদক ফাইলের নামের মধ্যে, এবং -0
পতাকা বলে xargs
এই আশা \0
বিভেদক। এটি আরও কার্যকরভাবে বহনযোগ্য (তবে দুর্ভাগ্যক্রমে আরও ভার্বোস) হলেও -exec
... +
পদ্ধতির সাথে প্রায় একই ধরণের আচরণ রয়েছে ।
ls
করে।
$()
করে অন্য কমান্ডগুলির সাথেও কাজ করে find
।
আমার কাছে শেল স্ক্রিপ্টের জন্য একটি কাজের মতো শোনাচ্ছে:
for file in 'find -name *.xml'
do
grep 'hello' file
done
বা এই জাতীয় কিছু
ফাইন্ড কমান্ডের একটি স্বতন্ত্র যুক্তি রয়েছে যা আপনি এই জাতীয় জিনিসের জন্য ব্যবহার করতে পারেন, আপনি সরাসরি এটি ব্যবহার করে গ্রেপ করতে পারেন।
উদাহরণস্বরূপ ( এখান থেকে, এই পৃষ্ঠায় অন্যান্য ভাল উদাহরণ ):
find . -exec grep "www.athabasca" '{}' \; -print
ব্যাশে, নিম্নলিখিতটি উপযুক্ত হবে:
find /dir -type f -print0 | xargs -0i cat {} | grep whatever
এটি /dir
ডিরেক্টরিতে সমস্ত ফাইল সন্ধান করবে এবং ফাইলের নামগুলি নিরাপদে পাইপ xargs
করবে যা নিরাপদে ড্রাইভ করবেgrep
।
xargs
আপনার যদি হাজার হাজার ফাইল থাকে তবে এড়িয়ে যাওয়া কোনও ভাল ধারণা নয় /dir
; cat
অতিরিক্ত যুক্তির তালিকার দৈর্ঘ্যের কারণে ভেঙে যাবে।xargs
আপনার জন্য যে সব সাজান।
-print0
আর্গুমেন্ট প্রাপ্ত করতে find
সঙ্গে জালের ফাঁস -0
যুক্তি xargs
ব্যবধান সহ ফাইলের নামের সঠিকভাবে পরিচালনা করতে। -i
আর্গুমেন্ট প্রাপ্ত করতে xargs
আপনি ফাইলের নাম যেখানে প্রয়োজন সন্নিবেশ করতে পারেন cat
কমান্ড লাইন। বন্ধনীগুলি ফাইলের নাম cat
থেকে কমান্ডটিতে পাইপ করা হয়েছে find
।
এটি আমার পক্ষে কাজ করে
find _CACHE_* | while read line; do
cat "$line" | grep "something"
done
Ggrep ব্যবহার করুন ।
ggrep -H -R -I "mysearchstring" *
বর্তমান ডিরেক্টরি বা একটি উপ ডিরেক্টরিতে অবস্থিত পাঠ্যগুলি সহ ইউনিক্সে ফাইল অনুসন্ধান করতে search
এটি কেবল ফাইলগুলির নাম এবং বিষয়বস্তু কেবল পুনরাবৃত্তভাবে মুদ্রণ করবে ..
find . -type f -printf '\n\n%p:\n' -exec cat {} \;
সম্পাদনা (উন্নত সংস্করণ): এটি কেবল পাঠ্য নামগুলির (পাঠানো) নাম এবং লিখিত সামগ্রী মুদ্রণ করবে কেবল পুনরাবৃত্তভাবে ..
find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'
আরও একটি চেষ্টা
find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;
আপনি কি ফাইলগুলিতে পাঠ্য সন্ধান করার চেষ্টা করছেন? আপনি কেবল তার জন্য গ্রেপ ব্যবহার করতে পারেন ...
grep searchterm *
ডিরেক্টরি / ghi এবং / jkl এ একটি সার্ভারে সমস্ত abc.def ফাইলের সামগ্রী তালিকাভুক্ত করতে এবং দেখতে
find /ghi /jkl -type f -name abc.def 2> /dev/null -exec ls {} \; -exec cat {} \;
Abc.def ফাইলগুলিতে তালিকাভুক্ত করতে যেগুলি এন্ট্রি মন্তব্য করেছে এবং ডিরেক্টরিগুলি / ghi এবং / jkl এ সেগুলি দেখুন
find /ghi /jkl -type f -name abc.def 2> /dev/null -exec grep -H ^# {} \;
find -name '*.foo' -print
আমার জন্য দুর্দান্ত কাজ করেছে ... ধন্যবাদ