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


32

मैं फ़ाइलों की पंक्तियों की संख्या को उन पंक्तियों की संख्या के आधार पर /group/book/four/wordक्रमबद्ध कैसे कर सकता हूँ ?

ls -l आदेश उन्हें नीचे सूचीबद्ध करता है, लेकिन उन्हें क्रमबद्ध नहीं करता है


1
क्या आप लाइनों की संख्या द्वारा सूचीबद्ध फ़ाइलों को चाहते हैं, या फाइलों में लाइनों की संख्या को सूचीबद्ध करें या दोनों? ls -lलाइनों की संख्या नहीं देता है। ls -lSकुछ lsकार्यान्वयन के साथ आकार फ़ाइल प्रकार ( आकार सामग्री में बाइट्स की संख्या)।
स्टीफन चेज़लस 12

जवाबों:


34

आपको इस तरह से एक कमांड का उपयोग करना चाहिए:

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कमांड के कारण अपवोट
फ्रांसिस्को

मैं केवल एक्स लाइनों के साथ फ़ाइल को न्यूनतम दिखाने के लिए कैसे फ़िल्टर कर सकता हूं (छूट के लिए एक्स = 0 लाइन को छोड़कर)?
मैट्रिक्स

11

गैर पुनरावर्ती

यदि आपको पुनरावृत्ति की आवश्यकता नहीं है तो संभवतः सबसे सरल संस्करण:

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


3
grep -c .उन पंक्तियों को गिनता है जिनमें कम से कम एक वैध वर्ण होता है। grep -c '^'सभी लाइनों की गिनती करने के लिए उपयोग करें (कुछ grepकार्यान्वयन के साथ अंतिम नई रेखा के बाद अनुगामी वर्णों की भी गणना करेंगे )। ध्यान दें कि सभी grepकार्यान्वयन एक का समर्थन नहीं करते हैं -rऔर व्यवहार उन लोगों के बीच भिन्न होता है जो करते हैं। आप के :लिए रिक्त स्थान के लिए एस (बृहदान्त्र, अर्धविराम नहीं) का अनुवाद करने की आवश्यकता नहीं है sort। बस उपयोग करें -t:। ध्यान दें कि फ़ाइल नामों में मान है :या रिक्त या newline वर्ण नहीं हैं।
स्टीफन चेजलस 18

1
अपने गैर-पुनरावर्ती समाधान पोस्ट करने के लिए धन्यवाद; wcअगर आप एक से अधिक रास्तों से गुजरते हैं तो मुझे इस तरह का कोई आसान काम नहीं मिला । वाइल्ड कार्ड और पाइप के साथ कार्यक्षमता को युग्मित करना sortवास्तव में साफ है।
21

7

के साथ zsh:

lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)

हम एक नए सॉर्टिंग फ़ंक्शन को परिभाषित करते हैं linesजो फ़ाइल में लाइनों की संख्या के साथ उत्तर देता है। और हम o+linesग्लोब क्वालीफायर का उपयोग करते हैं जो n(संख्यात्मक प्रकार के लिए) एक साथ परिभाषित करता है कि ग्लोब के परिणाम कैसे क्रमबद्ध हैं। ( .यह भी केवल नियमित फ़ाइलों की जाँच करने के लिए जोड़ा गया है)।

यह इस बात पर कोई अनुमान नहीं लगाता है कि फ़ाइल के नाम में छिपी हुई फ़ाइलों के अलावा कौन-से अक्षर हो सकते हैं (जो शुरू होते हैं .) छोड़ दिए जाते हैं। Dग्लोब क्वालीफायर जोड़ें यदि आप उन्हें भी चाहते हैं।


2
ओपी को bashकेवल टैग किया जाता है ...
lbb0

7
@ l0b0 का मतलब यह नहीं है कि अगले व्यक्ति को इसकी आवश्यकता है वह भी बैश चल रहा होगा।
terdon

4

आप निर्दिष्ट नहीं करते हैं कि आप फ़ाइलों को किसी उपनिर्देशिका में भी चाहते हैं या नहीं /group/book/four/wordfindJherran के जवाब में समाधान निदेशिकाओं में उतरेगा। यदि वह नहीं चाहता है, तो इसके बजाय शेल का उपयोग करें:

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

ध्यान दें कि bash4.3 से पहले के संस्करण, सहानुभूति का पालन कर रहे थे जब निर्देशिका पेड़ की पुनरावृत्ति होती है (जैसेzsh 'या tcsh' s ***/*) के ।

इसके अलावा, ऊपर दिए गए सभी समाधान छिपी हुई फ़ाइलों को अनदेखा कर देंगे (जिनके नाम के साथ शुरू होता है ., shopt -s dotglobउन्हें शामिल करने के लिए उपयोग करें) और इसमें प्रतीकात्मक लिंक की लाइन गणना भी शामिल होगी (जो findदृष्टिकोण नहीं होगा)।


ध्यान दें कि jherran के समाधान से अन्य अंतर यह है कि आपका नियमित फ़ाइलों ( -xtype fGNU में या *(-.)zsh में) के लिए सिम्लिंक पर भी विचार करेगा और छिपी हुई फ़ाइलों को छोड़ देगा।
स्टीफन चेज़लस

@ स्टीफनचेज़ेलस धन्यवाद, स्पष्ट। क्यों %luमें printf? जैसा कि मुझे याद है, इसका मतलब है कि लंबे समय तक अहस्ताक्षरित दशमलव, क्या यह वास्तव में आवश्यक है? संख्या को स्ट्रिंग के रूप में क्यों नहीं माना जाता है? क्या इससे कोई फर्क पड़ता है?
terdon

2
यदि wc आउटपुट रिक्त है (उदाहरण के लिए क्योंकि फ़ाइल पठनीय नहीं है), तो वह 0खाली स्ट्रिंग के बजाय विस्तारित होगी , जो थोड़ा बेहतर है। कुछ प्रकार के कार्यान्वयन बिना हस्ताक्षर किए पूर्णांक के साथ काम करते हैं। %luसबसे सुरक्षित शर्त की तरह लगता है, लेकिन शायद यह मायने नहीं रखता है जैसे कि आपके पास 2^31लाइनें हैं, वैसे भी उम्र लग जाएगी।
स्टीफन चेज़लस

1

यदि आप fdरस्ट में लिखी एक बहुत तेज़ फ़ाइल खोजक स्थापित करना चाहते हैं (आपको इसे स्थापित करना चाहिए, वैसे भी यह बहुत अच्छा है)

fd --type=file . | xargs wc -l | sort -n

मूल रूप fdसे फ़ाइलों को सूचीबद्ध करता है, xargs फ़ाइलों की सूची को पास करेगा wc(शब्द गणना के लिए खड़ा है, लेकिन पासिंग -l इसे गिनती लाइनें बना देगा) फिर अंत में इसे कम से कम लाइनों की संख्या से सबसे बड़ी उपयोग करने के लिए हल किया जाता है sort -n

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