পিভি ব্যবহার করে গ্রেপ অগ্রগতি বার (পাইপ ভিউয়ার)


11

আমি আমার কম্পিউটারে একটি বিশাল ডিরেক্টরি পেয়েছি এবং স্ট্রিংয়ের জন্য আমার ভিতরে প্রতিটি রুবি ফাইল অনুসন্ধান করতে হবে।

আমি এটি এটি করতে পারতাম: grep -R "string" *.rbতবে এটি সত্যই দীর্ঘ সময় নেয় এবং আমি অগ্রগতি পর্যবেক্ষণ করতে সক্ষম হতে একটি অগ্রগতি বার দেখানোর জন্য পিভি (পাইপ প্রদর্শক) ব্যবহার করতে চাই grep

তবে আমি সত্যিই জানি না আমি এই কমান্ডটি কীভাবে লিখতে পারি কারণ এখনও এই আদেশটি সম্পর্কে আমি বুঝতে পারি না এমন কিছু জিনিস রয়েছে।

কেউ ধারণা পেয়েছে?

উত্তর:


15

pvপাইপগুলিতে পরিচালনা করে (কমান্ড নয়) - এটি একটি ভলিউম গেজ যা দেখায় যে পাইপলাইনে একটি নির্দিষ্ট বিন্দুতে কতটা ডেটা গেছে।
তোমার grep কমান্ড প্রয়োগ হয় না একটি পাইপলাইন ( |- pipe operatorকোথাও পাওয়া যাবে) - এটা শুধু একটা একক তার জিনিস করছেন কমান্ড আছে। pvআপনাকে এখানে সহায়তা করতে পারে না, আপনাকে কেবল বিশ্বাস করতে grepহবে যে সমস্ত ইনপুট ফাইলগুলিতে এটি আসলে কাজ করছে।

আপনি পারে খোঁজ, PV, xargs &, grep (সাথে কিছু একসঙ্গে খোয়া find . -name "*.rb" | pv | xargs grep [regex]এটা দেখে মনে হচ্ছে প্রতিশ্রুতি করা যেতে পারে, কিন্তু আপনি বলতে হবে pvকত বড় findআউটপুট এটা অর্থপূর্ণ ফলাফল দিতে হয়।

সত্যি বলতে এটিকে নিজের কাজের চেয়ে বেশি কাজ বলে মনে হচ্ছে। কেবল আপনার গ্রেপ চালান, ধৈর্য সহকারে অপেক্ষা করুন , এবং আউটপুটটি হয়ে গেলে এটি পরিচালনা করুন।


1
এটি অবশ্যই সম্ভব , এটি কেবল
বিশৃঙ্খলাযুক্ত এবং গ্রাইপ

1
সত্যিই চমৎকার স্নিপেট হতে পারে: পি
সাইডোনিয়া 7

4

আরও দুটি পদ্ধতি:

for file in *.rb; do echo $file; grep "string" $file >> output.txt; done

অথবা, আপনার আসল কমান্ডটি চলার সময় অন্য কোনও শেলের মধ্যে গ্রেপ কমান্ডের পিডটি সন্ধান করুন এবং তারপরে:

strace -q -s 256 -e trace=open -p [pid] 2>&1 | head

উপরের দুটোই আপনাকে দেখাবে যে বর্তমানে গ্রেপ কমান্ডটি কোন ফাইলটিতে কাজ করছে। আপনি এতে ফাইলের মোট সংখ্যা খুঁজে পেতে পারেন:

ls -l *.rb | wc -l

শেষ অবধি, তালিকায় বর্তমান ফাইলটি কোন সংখ্যাটি নির্ধারণ করতে এটি ব্যবহার করুন:

ls -l *.rb | grep -n [the current filename]

পিএস আমার উত্তরগুলি ধরে নিয়েছে যে আপনার সমস্ত ফাইল একক ডিরেক্টরিতে রয়েছে। যদি তা না হয় তবে আপনার findপরিবর্তে lsএবং *.rbপাতলা পরামর্শ হিসাবে ব্যবহার করতে হবে ।


1
এটি একটি দুর্দান্ত বিকল্প
সাইডোনিয়া 7

1

আপনি কী ওএস ব্যবহার করছেন তা আমি নিশ্চিত নই, তবে grep -R "string" *.extসম্ভবত আপনার পক্ষে সঠিকভাবে কাজ করছে না।

আপনি ভাল ব্যবহার পরিবেশিত করা যেতে পারে findসাথে grep:

find . -type f -name "*.rb" -print0 |xargs --null grep "string"


ঠিক আছে, আমি যে কমান্ড দিয়েছি তা আসলে ফেডোরার 16 এ কাজ করে তবে আপনার বিষয়টি আরও পরিষ্কার। ধন্যবাদ !
সাইডোনিয়া 7

1

সাম্প্রতিক সংস্করণে pvএকটি আছে "-d"অন্য প্রক্রিয়া সব FDs দেখার জন্য -Option।

সুতরাং তত্ত্বগতভাবে pvকেবল পাইপ হিসাবেই নয় পুরো প্রক্রিয়াটির জন্য একটি অগ্রগতি-সূচক হিসাবেও কাজ করবে। (উদাহরণস্বরূপ, আপনার ফায়ারফক্সের পিআইডি দিয়ে এটি ব্যবহার করে দেখুন)

উপরের সমস্যাটির জন্য একটি সহজ ধারণাটি নিম্নলিখিত: নিম্নলিখিত grepচলমান চলাকালীন, lsofএকসাথে ব্যবহার করুন watch

$ watch -n 1 "lsof | grep -n $PWD"

এইভাবে আপনি আপনার গ্রেপের অগ্রগতি পর্যবেক্ষণ করতে পারেন।


0

আপনি ইতিমধ্যে চেষ্টা করেছেন?

grep -R "string" *.rb | pv

আমি জানি না যে এটি আসলে কাজ করে কারণ এটি পুনরাবৃত্ত হওয়ার কারণে মোট ডেটার কত বিট অনুসন্ধান করতে হবে তা জানেন না?


4
আমি মনে করি না এটি তার যা করতে চায় তা করবে - pvগ্রেপের আউটপুটটিতে কাজ করবে (তাই এমনকি যদি তিনি সম্পূর্ণ ইনপুট আকারটি নির্দিষ্ট করে থাকেন pvতবে পাইপের শেষাংশে আউটপুট আসতে দেখায় - এটি পথের অধীনে হবে -মাউন্ট বাইটস।
ভোরেটাক 7

0

আমি সাধারণত লিনাক্স সিস্টেমে প্রো-ফাইল সিস্টেম ব্যবহার করি, যেমন

ls -al /proc/<pid of grep>/fd

এটি গ্রেপ-অনুরোধটি বর্তমানে খোলার সমস্ত ফাইলের তালিকাবদ্ধ করে এবং বর্তমানে অনুসন্ধানে এটি কোথায় রয়েছে তা একটি ধারণা দেয়।

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