डायरेक्टरी ट्री में एक निश्चित एक्सटेंशन की सभी फाइलों का आकार


17

मैं अपने होम फोल्डर में .o एक्सटेंशन (ऑब्जेक्ट फाइल) के साथ फाइल का आकार जानना चाहता हूं।

मैं सभी ऑब्जेक्ट फ़ाइलों का उपयोग करके पा सकता हूं

find . -name '*.o'

अब मैं उन फ़ाइलों के कुल आकार की गणना कैसे कर सकता हूं?

जवाबों:


24

आप पाइप ( |) की तलाश में हैं। वे कई कमांडों को जोड़ने और एक कमांड के आउटपुट को दूसरे के इनपुट के रूप में पास करने का एक तरीका है। इस स्थिति में, आप उन सभी फ़ाइल नामों को पास करना चाहते हैं जिन्हें आप इनपुट के रूप में पाते हैं du(जो आकार की गणना करता है)। हालाँकि, क्योंकि duफ़ाइल के नाम की उम्मीद है और परिणाम findकेवल पाठ की एक सूची है (हाँ, पाठ में फ़ाइल नाम शामिल हैं, लेकिन duयह नहीं जान सकते कि, यह सब देखता है पाठ है), आपको कुछ ऐसा उपयोग करने की आवश्यकता है xargsजो प्रत्येक को ले जाएगा पाठ की पंक्ति, इसे फ़ाइल नाम के रूप में मानें और इसे पास करें du। यह सब एक साथ रखते हुए, हम प्राप्त करते हैं:

find . -name "*.o" | xargs du -sch
  • आपको हमेशा अपने द्वारा दिए गए पैटर्न को उद्धृत करना चाहिए find(जैसा कि मैंने ऊपर किया है:) "*.o"। यदि आप नहीं करते हैं, तो शेल *.oवर्तमान निर्देशिका में किसी भी मिलान फ़ाइलों के नाम का विस्तार करेगा । इस मामले में इसने केवल इसलिए काम किया क्योंकि आपके पास कोई मेल नहीं थी।

  • के लिए -schझंडे duमें प्रलेखित हैं man du:

    -c, --total
          produce a grand total
    -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)
    -s, --summarize
          display only a total for each argument
    

हालाँकि, ध्यान दें कि यह व्हाट्सएप वाले फ़ाइलनाम के लिए विफल हो जाएगा। यह लगभग निश्चित रूप से ऑब्जेक्ट फ़ाइलों के लिए एक समस्या नहीं है, लेकिन भविष्य में, यदि आपको रिक्त स्थान से निपटने की आवश्यकता है, तो उपयोग करें:

find . -name "*.o" -print0 | xargs -0 du -sch

-print0बनाता है findशून्य से अलग की गई लाइनों प्रिंट और -0बनाता है xargsइनपुट के रूप में इस तरह के लाइनों ले।

वैकल्पिक रूप से, आप findस्वयं आकार प्रिंट कर सकते हैं और फिर उन्हें योग कर सकते हैं:

find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'

यह टिप्पणी में @Serg द्वारा बताई गई समस्या के आसपास भी पहुंच जाएगा जहां बहुत सारे तर्क हैं और कमांड को अलग-अलग कमांड में तोड़ दिया जाता है।


यदि आप उपयोग कर रहे हैं bash(आप शायद हैं), तो एक सरल तरीका है:

shopt -s globstar 
du -sch **/*.o

shopt globstarआदेश बनाता है **सभी फ़ाइलें और या अधिक उप निर्देशिकाओं से मेल खाते हैं। इसे सक्षम करने के बाद, **/*.oसभी फाइलों (और निर्देशिकाओं) से मेल खाएंगे , जिनका नाम समाप्त होता है .o, इसलिए हम इसे सीधे पास कर सकते हैं du

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

shopt -s dotglob globstar
du -sch **/*.o

पहले वाले के साथ थोड़ी समस्या है। MAXARGS जैसी कोई चीज़ है। तो वहाँ के कई पुनरावृत्तियों होगा du, और यह कई totalलाइनों का उत्पादन होगा । यहाँ उदाहरण है: paste.ubuntu.com/23092752
Sergiy Kolodyazhnyy

@ सच सच। मैंने एक और विकल्प जोड़ा जो इससे बचता है।
टेराडॉन

आपका पहला shopt globstarउदाहरण बाहर निकल जाता है -s; मुझे shopt -s globstarआपके दूसरे उदाहरण के समान उपयोग करना था ।
क्रेजीप्रो

@CrazyPyro d'oh! क्षमा करें, यह एक टाइपो था। इस पर ध्यान दिलाने के लिए धन्यवाद। shopt OPTIONएक -sया एक -u(या अन्य विकल्प के बिना , देखें help shopt) केवल विकल्प के वर्तमान मूल्य को प्रिंट करता है। आपको shopt -s OPTIONएक shopt -u OPTIONको चालू करने और इसे बंद करने की आवश्यकता है।
टेराडो

8

(प्रत्येक फ़ाइल के अनुसार अर्थ) कमांड -exec चलाने के लिए ध्वज का उपयोग करेंdu;

find . -name "*.o" -exec du -b {} \; | awk '{total+=$1}END{print total}' 

नमूना उत्पादन:

$ find . -name "*.txt"  -exec du -b {} \; | awk '{total+=$1}END{print total,"bytes" }'                                     
find: ‘./.cache/gvfs-burn’: Permission denied
find: ‘./.cache/unity’: Permission denied
852690242 bytes

findपुनरावर्ती है - जिसका अर्थ है कि यह सभी उपनिर्देशिकाओं के माध्यम से चलता है। यदि आप *.oवर्तमान निर्देशिका में सभी फ़ाइलों को प्राप्त करना चाहते हैं , तो बस करें

du -b -c *.o

0

पर्ल के साथ:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

वर्तमान निर्देशिका में सभी गैर-छिपी पीडीएफ फाइलों का आकार।


1
ठीक है, लेकिन ओपी .oफाइलों की तलाश में है और वे उपनिर्देशिकाओं में हो सकते हैं। आप प्रत्येक पुनरावृत्ति के लिए राशि को प्रिंट करने से बचने के लिए }{पहले जोड़ना चाह सकते हैं print $sum। हम केवल आखिरी चाहते हैं।
टेराडन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.