মানব পাঠযোগ্য বিন্যাসে ডিরেক্টরিতে প্রতিটি ফাইলের লাইন সংখ্যা আপনি কীভাবে তালিকাভুক্ত করবেন।


40

আমার কাছে ডিরেক্টরি এবং উপ-ডিরেক্টরিগুলির একটি তালিকা রয়েছে যাতে বড় সিএসভি ফাইল থাকে। এই ফাইলগুলিতে প্রায় 500 মিলিয়ন লাইন রয়েছে, প্রতিটি রেকর্ড। আমি জানতে চাই

  1. প্রতিটি ফাইলে কত লাইন থাকে।
  2. ডিরেক্টরিতে কত লাইন রয়েছে।
  3. মোট কত লাইন

সবচেয়ে বড় কথা, আমার এটি 'মানব পাঠযোগ্য বিন্যাসে' উদাহরণস্বরূপ দরকার। 12345678 এর চেয়ে 12,345,678

এটি কীভাবে 3 উপায়ে করা যায় তা শিখলে ভাল লাগবে। সাদামাটা ভ্যানিলা বাশ সরঞ্জাম, অ্যাডক ইত্যাদি, এবং পার্ল (বা পাইথন)।

উত্তর:


56

প্রতিটি ফাইলে কত লাইন থাকে।

wcমূলত শব্দ গণনার জন্য ব্যবহার করুন , আমি বিশ্বাস করি, তবে এটি লাইন, শব্দ, অক্ষর, বাইট এবং দীর্ঘতম রেখার দৈর্ঘ্য করতে পারে। -lবিকল্প বলা হয়েছে যে সব লাইন গণনা।

wc -l <filename>

এটি এতে রেখার সংখ্যা আউটপুট দেবে:

$ wc -l /dir/file.txt
32724 /dir/file.txt

আপনি wcপাশাপাশি ডেটা পাইপ করতে পারেন :

$ cat /dir/file.txt | wc -l
32724
$ curl google.com --silent | wc -l
63

ডিরেক্টরিতে কত লাইন রয়েছে।

চেষ্টা করুন:

find . -name '*.pl' | xargs wc -l

অন্য একটি লাইনার:

( find ./ -name '*.pl' -print0 | xargs -0 cat ) | wc -l

বিটিডাব্লু, wcকমান্ড লাইনের পরিবর্তে নতুন লাইন কোড গণনা করে। যখন ফাইলের শেষ লাইনটি নতুন লাইন কোডের সাথে শেষ হয় না, এটি গণনা করা হবে না।

আপনি গ্রেপ-সি ^ ব্যবহার করতে পারেন, পুরো উদাহরণ:

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another shell
done
echo TOTAL LINES COUNTED:  $total

মোট কত লাইন

নিশ্চিত না যে আমি আপনার অনুরোধটি সঠিকভাবে বুঝতে পেরেছি। উদাহরণস্বরূপ এটি প্রতিটি ফাইলের জন্য রেখার সংখ্যা দেখিয়ে নিম্নলিখিত বিন্যাসে ফলাফল দেয়:

# wc -l `find /path/to/directory/ -type f`
 103 /dir/a.php
 378 /dir/b/c.xml
 132 /dir/d/e.xml
 613 total

বিকল্পভাবে, নিম্নলিখিত কমান্ড থেকে ফাইল গণনা করে ফাইল ব্যতীত নতুন লাইন অক্ষরের মোট সংখ্যা নির্ধারণ কার্যকর হতে পারে:

# find /path/to/directory/ -type f -exec wc -l {} \; | awk '{total += $1} END{print total}'
 613

সবচেয়ে বড় কথা, আমার এটি 'মানব পাঠযোগ্য বিন্যাসে' উদাহরণস্বরূপ দরকার। 12345678 এর চেয়ে 12,345,678

বাশের একটি প্রিন্টফ ফাংশন অন্তর্নির্মিত রয়েছে:

printf "%0.2f\n" $T

সর্বদা হিসাবে, এখানে অনেকগুলি ভিন্ন পদ্ধতি রয়েছে যা এখানে উল্লিখিত একই ফলাফল অর্জনের জন্য ব্যবহার করা যেতে পারে।


যাইহোক, আমি কীভাবে আপনার উদাহরণগুলিতে প্রিন্টফ ব্যবহার করব? আমি ডাব্লুসি-এল থেকে এটিতে পাইপ দেওয়ার চেষ্টা করেছি, তবে এটি কার্যকর হয়নি।
হেক্সাটোনিক

চেষ্টা করুন> সন্ধান করুন। -নম '* .পিএল' | xargs WC -l | awk '{প্রিন্টফ ("% 0.2f", $ 1) needs {মুদ্রণ $ 2}' আপনার প্রয়োজনের জন্য '
প্রিন্টফ

যদিও এটি আরও বেশি মানব পাঠযোগ্য হয়ে ওঠার জন্য এটি সংখ্যায় কমা যুক্ত করে না। এটি কেবল শেষ পর্যন্ত একটি শূন্য যুক্ত করে।
হেক্সাটোনিক

প্রতিধ্বনি 100000000000000 | xargs
প্রিন্টফ

1
@Hexatonic printfথেকে তার আর্গুমেন্ট পড়া নেই stdin, বরং কম্যান্ড লাইন থেকে (থেকে বংশীধ্বনিতুল্য তুলনা echoবনাম করার বংশীধ্বনিতুল্য cat; catথেকে সার্চ stdin, echoনা)। পরিবর্তে, printf "$(find ... | xargs ...)"আর্গুমেন্ট হিসাবে আউটপুট সরবরাহ করতে ব্যবহার করুন printf
বলপয়েন্টবেন

13

অনেক ক্ষেত্রে wcকমান্ড এবং ওয়াইল্ডকার্ডের সংমিশ্রণই *যথেষ্ট হতে পারে।
আপনার সমস্ত ফাইল যদি একক ডিরেক্টরিতে থাকে আপনি কল করতে পারেন:

wc -l src/*

আপনি বেশ কয়েকটি ফাইল এবং ডিরেক্টরি তালিকাভুক্ত করতে পারেন:

wc -l file.txt readme src/* include/*

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


একটি ডিরেক্টরিতে পুনরাবৃত্তভাবে সমস্ত ফাইল গণনা করতে:

প্রথমত, shopt -s globstarআপনার .bash_ প্রোফাইলে যুক্ত করে গ্লোবস্টার সক্ষম করুন। গ্লোবস্টারের জন্য সহায়তার জন্য বাশ ≥ 4.x প্রয়োজন যা brew install bashপ্রয়োজনে ইনস্টল করা যেতে পারে । আপনি আপনার সংস্করণ দিয়ে পরীক্ষা করতে পারেন bash --version

তারপরে চালান:

wc -l **/*

মনে রাখবেন যে গ্লোবস্টার সক্ষম না করা থাকলে এই আউটপুটটি ভুল হবে।


এবং কার্নেন্ট ডিরেক্টরিতে পুনরাবৃত্তভাবে ফাইল গণনা করার জন্য:wc -l **/*
টেলর এডমিস্টন

@ টেলরএডমিস্টন আমার জন্য (ম্যাকে) কেবলমাত্র একটি ডিরেক্টরি নীচে ফাইল গণনা করে। এটি বর্তমান ডিরেক্টরিতে ফাইলগুলি এড়িয়ে যায়, এবং একাধিক ডিরেক্টরি হতে পারে এমন যে কোনও উদাহরণের জন্য এটি সতর্ক করে যে এটি একটি ডিরেক্টরি: " wc: parent_dir/child_dir: read: Is a directory"
এম জাস্টিন

@ থমিও এটির জন্য গ্লোব স্টার সক্ষম হওয়া প্রয়োজন। ম্যাকোজে, আমি বিশ্বাস করি এটি বাক্সের বাইরে অক্ষম। আমি কেবলমাত্র আপনার উত্তরে একটি সম্পাদনা পাঠিয়েছি যা কমান্ডটি যুক্ত করে এবং কীভাবে গ্লোবস্টার সক্ষম করতে পারে।
টেলর এডমিস্টন

2

এই নির্দেশটি প্রতিটি ডিরেক্টরিতে লাইন কোডের তালিকা দেবে:

find . -name '*.*' -type f | xargs wc -l

2

গেমটিটি কিছুটা দেরীতে হলেও ডির আকারের কারণে আমি উপরের সাথে যুক্তি ত্রুটির একটি গুচ্ছ পেয়েছি। এটি আমার পক্ষে কাজ করেছে:

for i in $(find . -type f); do wc -l $i; done >> /home/counts.txt


0

catফাইলগুলিকে এক সাথে একত্রিত করে স্টাডআউটে সমস্ত কিছু আউটপুট করে দেয়, আপনি wc -lএকটি ডিরেক্টরিতে ফাইলের মোট লাইন গণনার জন্য এটি করতে পারেন :

cat /path/to/directory/* | wc -l

0

আমি নিম্নলিখিতগুলির জন্য @ ম্যালি উত্তরটি বাড়িয়ে দেব (একটি মন্তব্যের জন্য বড়):

মোট কত লাইন

অনেক উত্তর wcকমান্ড লাইন ফাইল বিকল্প ব্যবহার করে xargs। Xargs এর সাথে সমস্যাটি বরং একটি ছোট প্ল্যাটফর্ম নির্ভর আকারের মধ্যে সীমাবদ্ধ।

তদুপরি বিএসডি (ম্যাকোস) এবং জিএনইউ (লিনাক্স / হোমব্রিউ) মধ্যে পার্থক্য রয়েছে wc

GNU এক আদর্শ কারণ এটি আর্গুমেন্টের পরিবর্তে ( --files0) ফাইল থেকে ফাইল তালিকা পড়তে পারে ।

আপনি যদি ম্যাক হয়ে থাকেন এবং হোমব্রব করেন তবে আপনার নিম্নলিখিতটি করা উচিত:

find . -name "*.pl" -print0 | gwc -l --files0=-

Wc এর পরিবর্তে gwc লক্ষ্য করুন

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