जब wc के साथ लाइनों की गिनती करते हैं, तो जब भी कोई निर्देशिका होती है, तो एक त्रुटि प्रिंट न करें


12

मैं सभी /etcफ़ाइलों में कुल पंक्तियों की संख्या गिनना चाहता हूं, लेकिन उप निर्देशिकाओं में फाइलें नहीं, इसलिए मैंने टाइप किया: wc -l /etc/* | tail -1और आउटपुट निम्न हैं:

xxxx is a directory 
yyyy is a directory
total 1752

मेरा प्रश्न यह है कि मैं इन टिप्पणियों को कैसे हटा सकता हूं (हटा सकता हूं), और क्या इस प्रकार की गणना करने का एक बेहतर तरीका है?


1
मुझे लगता है कि खोज का उपयोग करना 100% राइट नहीं है, क्योंकि / आदि में न केवल नियमित फाइलें च हैं, बल्कि लिंक एल भी हैं। इसलिए यह संस्करण बहुत बेहतर है: $ sudo wc -l / etc / * 2> / dev / null | पूंछ -1
हमजा

जवाबों:


14

आप त्रुटि संदेशों को / dev / null में आउटपुट कर सकते हैं

$ 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) के लिए। उस अच्छाई के सभी कोष्ठक में संलग्न किया ()गया है, \ताकि शेल उन्हें 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सब कुछ डिफ़ॉल्ट रूप से मेल नहीं खाता है?
स्टीलड्राइवर

@steeldriver - यह मेरे बिना काम नहीं करता था '*'
राफेल

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