कैसे आप मानव पठनीय प्रारूप में एक निर्देशिका में हर फ़ाइल की पंक्तियों की संख्या को सूचीबद्ध करते हैं।


41

मेरे पास निर्देशिकाओं और उपनिर्देशिकाओं की सूची है जिनमें बड़ी सीएसएसवी फाइलें हैं। इन फ़ाइलों में लगभग 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

BTW, wcकमांड नए लाइनों के कोड को गिनता है, लाइनों को नहीं। जब फ़ाइल में अंतिम पंक्ति नए लाइन कोड के साथ समाप्त नहीं होती है, तो इसे गिना नहीं जाएगा।

आप grep -c ^, पूर्ण उदाहरण का उपयोग कर सकते हैं:

#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

हमेशा की तरह, कई अलग-अलग विधियां हैं जिनका उपयोग यहां वर्णित समान परिणामों को प्राप्त करने के लिए किया जा सकता है।


वैसे, मैं आपके उदाहरणों में प्रिंटफ का उपयोग कैसे करूं? मैंने इसे wc -l से पाइप करने की कोशिश की, लेकिन यह काम नहीं किया।
हेक्साटोनिक

कोशिश> खोजो। -नाम '* .pl' | xargs wc -l | awk '{printf ("% 0.2f", $ 1)} {प्रिंट $ 2}' अपनी ज़रूरतों के लिए '
प्रिंटफ़

यह संख्या में अल्पविराम नहीं जोड़ता है ताकि इसे और अधिक मानव पठनीय बनाया जा सके। यह अंत में एक शून्य जोड़ता है।
हेक्साटोनिक

इको 1000000000000 | xargs printf "% 'd \ n" 1,000,000,000,000
Hexatonic

1
@ हेक्साटोनिक 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_profile में जोड़कर सक्षम करें। ग्लोबस्टार के लिए समर्थन को बैश x 4.x की आवश्यकता होती है जिसे brew install bashयदि आवश्यक हो तो स्थापित किया जा सकता है । आप अपने संस्करण की जाँच कर सकते हैं bash --version

तो भागो:

wc -l **/*

ध्यान दें कि ग्लोबस्टार सक्षम नहीं होने पर यह आउटपुट गलत होगा।


और धाराओं निर्देशिका में फ़ाइलों की गिनती के लिए पुनरावर्ती:wc -l **/*
टेलर एड्मिस्टन

@TaylorEdmiston मेरे लिए (मैक पर) जो केवल फाइलों को एक डायरेक्टरी के ठीक नीचे गिनता है। यह वर्तमान निर्देशिका में फ़ाइलों को छोड़ देता है, और किसी भी उदाहरण के लिए जो एक से अधिक निर्देशिकाओं में गहरा होगा, यह चेतावनी देता है कि यह एक निर्देशिका है: " wc: parent_dir/child_dir: read: Is a directory"
एम। जस्टिन

@ थोमियो इसे सक्षम करने के लिए ग्लोबस्टार की आवश्यकता है। MacOS पर, मेरा मानना ​​है कि यह बॉक्स से बाहर अक्षम है। मैंने सिर्फ आपके उत्तर को संपादित किया है जो कमांड जोड़ता है और ग्लोबस्टार को कैसे सक्षम किया जाए।
टेलर एड्मिस्टन

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फ़ाइलों को एक में जोड़ देगा और सब कुछ stdout में आउटपुट कर देगा, आप wc -lउस पर एक निर्देशिका में फ़ाइलों की पंक्तियों की कुल गणना के लिए कर सकते हैं :

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

0

मैं निम्नलिखित के लिए केवल @ उत्तर का उत्तर दूंगा (एक टिप्पणी के लिए बड़ा करने के लिए):

कुल कितनी पंक्तियाँ

कई उत्तर wcकमांड लाइन फ़ाइल विकल्प का उपयोग कर रहे हैं xargs। इसके साथ समस्या यह है कि xargs एक छोटे प्लेटफ़ॉर्म पर निर्भर आकार तक सीमित है।

इसके अलावा BSD (macOS) और GNU (linux / homebrew) में अंतर है wc

GNU एक आदर्श है क्योंकि यह तर्कों ( --files0) के बजाय फ़ाइल से फ़ाइल लिस्टिंग पढ़ सकता है ।

यदि आप मैक पर हैं और आपके पास होमब्रेव है तो आपको निम्नलिखित कार्य करने चाहिए:

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

Wc के बजाय gwc पर ध्यान दें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.