Grep কোন ফলাফল ফেরত দেয় না কেন (ডিরেক্টরি সব ফাইল তালিকা)


3

আমি একটি ডিরেক্টরির মধ্যে সব ফাইল গণনা করার চেষ্টা করছি যে একটি প্যাটার্ন মেলে, recursively, ব্যবহার করে ls:

ls -R | grep *.{cpp,h} | wc

যাইহোক, আমি পেতে পারি:

zsh: কোন মিল খুঁজে পাওয়া যায়নি: *। সিপিপি

ls -R ফলাফল ফেরত দেয়, যদিও:

$ ls -R   CMakeLists.txt cmake src

./cmake:   মডিউল SUBS.cmake

./cmake/Modules:   FindGecode.cmake

./src:   A1_examples.h Sub1Main.cpp সুডোকু.cpp সুডোকু। এনকিউএইচসিপিপি

কেন না grep খোঁজো *.cpp যে ফাইল ls -R আয়?

সম্পাদনা: আমি খুব নিশ্চিত যে ls -R | grep *.{cpp,h} | wc এটি করার সেরা উপায় নয়, কারণ যে ls একক লাইন একাধিক ফলাফল প্রদান, কিন্তু আমি নিশ্চিত নই।


সিনট্যাক্স কি ধরনের {সিপিপি, এইচ}?
barlop

1
Multiline হিসাবে: তুলনা করুন ls থেকে ls | cat একদা। ls শুধুমাত্র সরাসরি রিপোর্ট করার সময় (অথবা যখন স্পষ্টভাবে বলা হয়েছে) multicolumn করতে যথেষ্ট স্মার্ট হয়; এটা অনুমান -C টার্মিনাল এবং জন্য -1 পাইপ জন্য।
geekosaur

@ ইজেকোসর আমি যে সচেতন ছিলাম না! ধন্যবাদ।
simont

উত্তর:


4

আপনি একসঙ্গে খেলা যে দুটি ভিন্ন ভুল করছেন। প্রথম, আপনি পাঠানো প্যাটার্ন উদ্ধৃত করতে হবে grep, অন্যথায় শেল এটি প্রথম প্রসারিত হবে। (যেখান থেকে ত্রুটি বার্তা আসে।) দ্বিতীয়, grep শেল globs গ্রহণ না, এটি একটি regex চায়।

zsh এটা কি হচ্ছে, আপনি বলতে চাইতে পারেন

$ ls **/*.{cpp,h} | wc -l

পরিবর্তে, একটি ব্যবহার করে zsh স্টাইল recursive গ্লব। আপনি অন্য এক ব্যবহার করতে চান, এটা

$ ls -R | egrep '\.(cpp|h)$' | wc -l

ধন্যবাদ। আমি শুধু এটা সমতল সঙ্গে কাজ করার চেষ্টা করা হয়েছে grep বরং egrep (কারণ আমি পার্থক্য কি ছিল জানি না)। আমার ভবিষ্যতের রেফারেন্সের জন্য: egrep হয় grep -E (বর্ধিত নিয়মিত এক্সপ্রেশনগুলির সক্রিয় ব্যবহার; নিয়মিত অভিব্যক্তি একটি বর্ধিত একটি হলে কেবল উত্তরগুলির বন্ধনীগুলি কাজ করে)।
simont

1
egrep মূল grep -E একটি GNUism হয়। এছাড়াও একটি GNUism আপনি পরিবর্তে escaping ব্যবহার করতে পারেন: grep '\.\(cpp\|h\)'। না পোর্টেবল হয়।
geekosaur
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.