यह मानते हुए कि आंतरिक हार्डलिंक नहीं हैं (अर्थात, 1 से अधिक हार्डलिंक वाली प्रत्येक फ़ाइल को पेड़ के बाहर से जोड़ा गया है), आप यह कर सकते हैं:
find . -links -2 -print0 | du -c --files0-from=-
संपादित करें और यहाँ मैंने टिप्पणी में क्या लिखा है, लागू किया गया। केवल बिना du
; नोट करने के लिए यश @StephaneChazelas के लिए du
आवश्यक नहीं है। अंत में स्पष्टीकरण।
( find . -type d -printf '%k + ' ; \
find . \! -type d -printf '%n\t%i\t%k\n' | \
sort | uniq -c | \
awk '$1 >= $2 { print $4 " +\\" }' ; \
echo 0 ) | bc
हम जो कुछ भी करते हैं वह प्रत्येक प्रासंगिक फ़ाइल के डिस्क उपयोग (KB में) के साथ एक स्ट्रिंग बनाना है, जो प्लस साइन्स द्वारा अलग किया गया है। फिर हम उस बड़े को खिलाते हैं bc
।
पहला find
मंगलाचरण निर्देशिकाओं के लिए करता है।
दूसरी find
प्रिंट लिंक गिनती, इनोड और डिस्क उपयोग। हम उस सूची को पास sort | uniq -c
करने के लिए (पेड़ में दिखावे की संख्या, लिंक गणना, इनोड, डिस्क उपयोग) प्राप्त करते हैं।
हम उस सूची को पास करते हैंawk
, और, यदि पहला फ़ील्ड (# दिखावे का) दूसरे (# हार्डलिंक) के बराबर या उससे अधिक है, जिसका अर्थ है कि पेड़ के बाहर से इस फ़ाइल के लिंक नहीं हैं, तो चौथे फ़ील्ड को प्रिंट करें ( डिस्क उपयोग) एक प्लस चिन्ह और एक बैकस्लैश संलग्न है।
अंत में हम एक आउटपुट करते हैं 0
, इसलिए सूत्र वाक्य रचना में सही है (यह +
अन्यथा में होगा ) और इसे पास करना होगा bc
। ओह।
(लेकिन मैं सरल पहली विधि का उपयोग करूंगा, अगर यह एक अच्छा पर्याप्त उत्तर देता है।)
du
केवल फ़ाइल आकारों को एक बार गिनता है, भले ही वे हार्ड लिंक से जुड़े हों जब तक कि आप-l
/--count-links
विकल्प का उपयोग न करें । आपdu
पूरे पेड़ पर दो बार दौड़ते हैं , उस विकल्प के साथ और उसके बिना और आकारों के बीच का अंतर होना चाहिए कि आपने सभी निर्देशिकाओं में कितना स्थान बचाया है।