जवाबों:
आप पाइप ( |) की तलाश में हैं। वे कई कमांडों को जोड़ने और एक कमांड के आउटपुट को दूसरे के इनपुट के रूप में पास करने का एक तरीका है। इस स्थिति में, आप उन सभी फ़ाइल नामों को पास करना चाहते हैं जिन्हें आप इनपुट के रूप में पाते हैं 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
shopt globstarउदाहरण बाहर निकल जाता है -s; मुझे shopt -s globstarआपके दूसरे उदाहरण के समान उपयोग करना था ।
shopt OPTIONएक -sया एक -u(या अन्य विकल्प के बिना , देखें help shopt) केवल विकल्प के वर्तमान मूल्य को प्रिंट करता है। आपको shopt -s OPTIONएक shopt -u OPTIONको चालू करने और इसे बंद करने की आवश्यकता है।
(प्रत्येक फ़ाइल के अनुसार अर्थ) कमांड -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
पर्ल के साथ:
perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf
वर्तमान निर्देशिका में सभी गैर-छिपी पीडीएफ फाइलों का आकार।
.oफाइलों की तलाश में है और वे उपनिर्देशिकाओं में हो सकते हैं। आप प्रत्येक पुनरावृत्ति के लिए राशि को प्रिंट करने से बचने के लिए }{पहले जोड़ना चाह सकते हैं print $sum। हम केवल आखिरी चाहते हैं।
du, और यह कईtotalलाइनों का उत्पादन होगा । यहाँ उदाहरण है: paste.ubuntu.com/23092752