जवाबों:
आपको इस तरह से एक कमांड का उपयोग करना चाहिए:
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
: अपने इच्छित पथ पर फ़ाइलों की खोज करें। यदि आप इसे पुनरावर्ती नहीं चाहते हैं, और आपका find
कार्यान्वयन इसका समर्थन करता है, तो आपको विकल्प -maxdepth 1
से ठीक पहले जोड़ना चाहिए -exec
।exec
: wc -l
हर फाइल पर निष्पादित करने के लिए कमांड को बताता है ।sort -rn
: परिणामों को संख्यात्मक रूप से उल्टे क्रम में क्रमबद्ध करें। अधिक से कम करने के लिए।(यह मान लिया जाता है कि फ़ाइल नाम में न्यूलाइन वर्ण नहीं हैं)।
wc
देगा , एक total
पंक्ति भी प्रिंट करेगा , इसलिए यहां आपको एक या अधिक "कुल" लाइनें मिलेंगी जब तक कि केवल एक फ़ाइल न हो । आप grep /
उन्हें हटाने के लिए पाइप कर सकते हैं।
sort
कमांड के कारण अपवोट
यदि आपको पुनरावृत्ति की आवश्यकता नहीं है तो संभवतः सबसे सरल संस्करण:
wc -l /group/book/four/word/*|sort -n
wc
-l
हर (लेकिन छिपी हुई) ( *
) फाइलों को लाइनों (विकल्प ) के तहत गिनता है /group/book/four/word/
, और sort
परिणाम (पाइप के माध्यम से |
) को संख्यात्मक रूप से (विकल्प -n
) क्रमबद्ध करता है ।
किसी ने इस जवाब का उल्लेख करते हुए टिप्पणी की grep -rlc
, इसे दबाने से पहले। वास्तव grep
में एक बढ़िया विकल्प है, खासकर अगर आपको पुनरावृत्ति की आवश्यकता है:
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
(विकल्प की गणना होती है -c
) रिकर्सिवली (विकल्प -r
) लाइनों मिलान ( grep
) '^'
(यह है कि, लाइनों की शुरुआत) निर्देशिका में /group/book/four/word/
। फिर आपको बृहदान्त्र को एक स्थान से बदलना होगा, उदाहरण के tr
लिए sort
, मदद करने के लिए , जिसे आप -n
दूसरे कॉलम (विकल्प -k2
) पर संख्यात्मक रूप से (विकल्प ) क्रमबद्ध करना चाहते हैं ।
अपडेट: संभावित सीमाओं के बारे में स्टीफन की टिप्पणी देखें और आप वास्तव में कैसे छुटकारा पा सकते हैं tr
।
grep -c .
उन पंक्तियों को गिनता है जिनमें कम से कम एक वैध वर्ण होता है। grep -c '^'
सभी लाइनों की गिनती करने के लिए उपयोग करें (कुछ grep
कार्यान्वयन के साथ अंतिम नई रेखा के बाद अनुगामी वर्णों की भी गणना करेंगे )। ध्यान दें कि सभी grep
कार्यान्वयन एक का समर्थन नहीं करते हैं -r
और व्यवहार उन लोगों के बीच भिन्न होता है जो करते हैं। आप के :
लिए रिक्त स्थान के लिए एस (बृहदान्त्र, अर्धविराम नहीं) का अनुवाद करने की आवश्यकता नहीं है sort
। बस उपयोग करें -t:
। ध्यान दें कि फ़ाइल नामों में मान है :
या रिक्त या newline वर्ण नहीं हैं।
wc
अगर आप एक से अधिक रास्तों से गुजरते हैं तो मुझे इस तरह का कोई आसान काम नहीं मिला । वाइल्ड कार्ड और पाइप के साथ कार्यक्षमता को युग्मित करना sort
वास्तव में साफ है।
के साथ zsh
:
lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)
हम एक नए सॉर्टिंग फ़ंक्शन को परिभाषित करते हैं lines
जो फ़ाइल में लाइनों की संख्या के साथ उत्तर देता है। और हम o+lines
ग्लोब क्वालीफायर का उपयोग करते हैं जो n
(संख्यात्मक प्रकार के लिए) एक साथ परिभाषित करता है कि ग्लोब के परिणाम कैसे क्रमबद्ध हैं। ( .
यह भी केवल नियमित फ़ाइलों की जाँच करने के लिए जोड़ा गया है)।
यह इस बात पर कोई अनुमान नहीं लगाता है कि फ़ाइल के नाम में छिपी हुई फ़ाइलों के अलावा कौन-से अक्षर हो सकते हैं (जो शुरू होते हैं .
) छोड़ दिए जाते हैं। D
ग्लोब क्वालीफायर जोड़ें यदि आप उन्हें भी चाहते हैं।
bash
केवल टैग किया जाता है ...
आप निर्दिष्ट नहीं करते हैं कि आप फ़ाइलों को किसी उपनिर्देशिका में भी चाहते हैं या नहीं /group/book/four/word
। find
Jherran के जवाब में समाधान निदेशिकाओं में उतरेगा। यदि वह नहीं चाहता है, तो इसके बजाय शेल का उपयोग करें:
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
यदि आपके फ़ाइल नामों में नई सीमाएँ हो सकती हैं, तो आप कुछ का उपयोग कर सकते हैं:
for file in ./*; do
[ -f "$file" ] &&
printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'
अंत में, यदि आप कर उपनिर्देशिका में उतर करना चाहते हैं, तो आप इस में उपयोग कर सकते हैंbash
4 या इसके बाद के संस्करण :
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
ध्यान दें कि bash
4.3 से पहले के संस्करण, सहानुभूति का पालन कर रहे थे जब निर्देशिका पेड़ की पुनरावृत्ति होती है (जैसेzsh
'या tcsh
' s ***/*
) के ।
इसके अलावा, ऊपर दिए गए सभी समाधान छिपी हुई फ़ाइलों को अनदेखा कर देंगे (जिनके नाम के साथ शुरू होता है .
, shopt -s dotglob
उन्हें शामिल करने के लिए उपयोग करें) और इसमें प्रतीकात्मक लिंक की लाइन गणना भी शामिल होगी (जो find
दृष्टिकोण नहीं होगा)।
-xtype f
GNU में या *(-.)
zsh में) के लिए सिम्लिंक पर भी विचार करेगा और छिपी हुई फ़ाइलों को छोड़ देगा।
%lu
में printf
? जैसा कि मुझे याद है, इसका मतलब है कि लंबे समय तक अहस्ताक्षरित दशमलव, क्या यह वास्तव में आवश्यक है? संख्या को स्ट्रिंग के रूप में क्यों नहीं माना जाता है? क्या इससे कोई फर्क पड़ता है?
0
खाली स्ट्रिंग के बजाय विस्तारित होगी , जो थोड़ा बेहतर है। कुछ प्रकार के कार्यान्वयन बिना हस्ताक्षर किए पूर्णांक के साथ काम करते हैं। %lu
सबसे सुरक्षित शर्त की तरह लगता है, लेकिन शायद यह मायने नहीं रखता है जैसे कि आपके पास 2^31
लाइनें हैं, वैसे भी उम्र लग जाएगी।
यदि आप fd
रस्ट में लिखी एक बहुत तेज़ फ़ाइल खोजक स्थापित करना चाहते हैं (आपको इसे स्थापित करना चाहिए, वैसे भी यह बहुत अच्छा है)
fd --type=file . | xargs wc -l | sort -n
मूल रूप fd
से फ़ाइलों को सूचीबद्ध करता है, xargs फ़ाइलों की सूची को पास करेगा wc
(शब्द गणना के लिए खड़ा है, लेकिन पासिंग -l इसे गिनती लाइनें बना देगा) फिर अंत में इसे कम से कम लाइनों की संख्या से सबसे बड़ी उपयोग करने के लिए हल किया जाता है sort -n
।
ls -l
लाइनों की संख्या नहीं देता है।ls -lS
कुछls
कार्यान्वयन के साथ आकार फ़ाइल प्रकार ( आकार सामग्री में बाइट्स की संख्या)।