ডাব্লুসিসি সহ লাইন গণনা করার সময়, যখনই ডিরেক্টরি হয় ত্রুটি মুদ্রণ করবেন না


12

আমি সমস্ত ডিরেক্টরিতে লাইনগুলির সংখ্যার সাথে /etcসাব ডিরেক্টরিতে ফাইলগুলি নয়, তাই আমি টাইপ করেছি: wc -l /etc/* | tail -1এবং আউটপুটটি এইরকম:

xxxx is a directory 
yyyy is a directory
total 1752

আমার প্রশ্ন হ'ল আমি কীভাবে এই মন্তব্যগুলি (মুছতে) মুছে ফেলতে পারি, এবং এই জাতীয় গণনা করার আরও ভাল উপায় কী?


1
আমি মনে করি যে সন্ধানটি ব্যবহার করা 100% দোষযুক্ত নয়, কারণ / ইত্যাদিতে কেবল নিয়মিত ফাইলই থাকে না তবে লিঙ্কও থাকে। সুতরাং এই সংস্করণটি আরও ভাল: do sudo wc -l / etc / * 2> / dev / নাল | লেজ -1
হামজা

উত্তর:


14

আপনি ত্রুটি বার্তাগুলি / dev / নাল এ আউটপুট করতে পারেন

$ wc -l /etc/* 2>/dev/null | tail -1

এই কমান্ডের সাহায্যে আপনি কেবল সেই ফাইলগুলির লাইনের সংখ্যা দেখতে পাচ্ছেন যা বিশ্ব পাঠযোগ্য। সমস্ত ফাইলের রেখার সংখ্যা দেখতে আপনাকে কমান্ডটি বাড়িয়ে তুলতে হবে sudo

$ sudo wc -l /etc/* 2>/dev/null | tail -1

8

ফাইলগুলি বিচ্ছিন্ন করুন এবং তাদের উপর wc চালান

কি wc -l /etc/*করে যে ডিরেক্টরিতে *সমস্ত আইটেম প্রসারিত হবে /etc/। সুতরাং লক্ষ্যটি তখন ফাইলগুলি বিচ্ছিন্ন করা এবং wcসেগুলি সম্পাদন করা। এটি করার বিভিন্ন উপায় রয়েছে।

পরীক্ষার সাথে লুপের জন্য

testকমান্ড, বা আরো ঘন ঘন সংক্ষিপ্ত যেমন [ব্যবহার করা যেতে পারে কিনা একটি আইটেম তাই মত একটি নিয়মিত ফাইল দেখুন:

[ -f "$FILE" ]

সুতরাং আমরা যা করতে পারি তা হ'ল সমস্ত আইটেমের মধ্যে পুনরাবৃত্তি হবে এবং কেবলমাত্র উপরের কমান্ডটি সত্য হলেই তা /etc/চালানো wcহবে। তাই ভালো:

for i in /etc/*; do [ -f "$i" ] && wc -l "$i" ; done             

অনুসন্ধান

আমরা ব্যবহার করতে পারেন findসঙ্গে -maxdepth, -typeএবং -execপতাকা

find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} +

  • -maxdepthডিরেক্টরি কাঠামোতে কত গভীর যেতে হবে তা অবহিত করে; 1 এর মান মানে আমরা যে ডিরেক্টরিটি চাই সেগুলিতে কেবল ফাইলগুলি।
  • -type f-oসিবোলিক লিঙ্কগুলির জন্য (প্রতিনিধিত্ব করে type l) নিয়মিত ফাইলগুলি অনুসন্ধান করতে, বা ( পতাকা দ্বারা উপস্থাপিত ) সন্ধান করতে বলে tells সেই সমস্ত ধার্মিকতা বন্ধনীগুলিতে আবদ্ধ হয়ে ()পালিয়ে গেছে \যাতে শেল তাদের findঅন্য কিছু না করে কমান্ডের অংশ হিসাবে ব্যাখ্যা করে ।
  • -exec COMMAND {} +কাঠামোটি এখানে আমরা যে কোনও কমান্ড দেই তা চালায়, এটি +সমস্ত পাওয়া ফাইলগুলি নেওয়ার নির্দেশ দেয় এবং সেগুলি কম্যান্ড লাইনে কমান্ড লাইন আর্গ হিসাবে স্টাফ করে।

মোট উত্পাদন করতে আমরা পাইপ আউটপুট tailপছন্দ করতে পারে

$ find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} + | tail -n 1           
[sudo] password for xieerqi: 
 11196  total

সাইড নোট

wc -l /etc/* 2>/dev/null | tail -1এলডি জেমসের জবাব অনুসারে, কেবল এটি ব্যবহার করা সহজ , তবে findফাইলের সাথে সম্পর্কিত ফাইলগুলির নাম প্রক্রিয়াকরণ এড়ানোর জন্য একটি অভ্যাসের অংশ হওয়া উচিত। এই বিষয়ে আরও তথ্যের জন্য ফাইলের নামগুলি কীভাবে সঠিকভাবে মোকাবেলা করতে হবে সেই প্রবন্ধটি পড়ুন


5

find এটি সহজেই করে:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*')

আউটপুট:

...
828 /etc/mime.types
25 /etc/ts.conf
66 /etc/inputrc
 0 /etc/subgid-
8169 total

কিন্তু যদি আপনি শুধু নম্বর চান আউটপুট এবং অন্য কিছুই হিসাবে:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | grep total | awk '{print $1}'

সম্পাদনা : newlinesত্রুটি কোস বিরাজ করে। কেবল -execএটি ব্যবহার করেই এটি সংশোধন করে। এছাড়াও, /etcএই জাতীয় ফাইল থাকে না।

আউটপুট:

8169

কোস দ্বারা চিহ্নিত হিসাবে , উপরের কমান্ডটি হ্রাস করা যেতে পারে:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | awk 'END {print $1}'

সম্পাদনা : newlinesত্রুটি কোস বিরাজ করে। কেবল -execএটি ব্যবহার করেই এটি সংশোধন করে। এছাড়াও, /etcএই জাতীয় ফাইল থাকে না।

আউটপুট:

8169

4
এর উদ্দেশ্য কী -iname '*'? findডিফল্ট সব কি মিলছে না ?
স্টিল্ড্রাইভার

@ স্টিলড্রাইভার - এটি আমার পক্ষে ছাড়া কাজ করে না '*'
রাফেল

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