2012-02-15 26 views
5

मैं वर्तमान में प्रत्येक निर्देशिका के लिए du कमांड का उपयोग करने का प्रयास कर रहा हूं। इसलिए मैं इस तरह के कोड का उपयोग करने की कोशिश कर रहा हूं:क्यों डु या गूंज पाइपलाइनिंग काम नहीं कर रही है?

ls | du -sb 

लेकिन यह अपेक्षा के अनुरूप काम नहीं कर रहा है। यह केवल वर्तमान 'के आकार का उत्पादन करता है। निर्देशिका और वह सब कुछ है। एक ही बात गूंज

ls | echo 

आउटपुट खाली पंक्ति के साथ है। ये क्यों हो रहा है?

उत्तर

11

एक पाइप का उपयोग करते हुए बच्चे प्रक्रिया (2 आदेश) की stdin (इनपुट) के लिए, पहले आदेश के उत्पादन ( stdout) भेजता है। आपके द्वारा उल्लिखित आदेश stdin पर कोई इनपुट नहीं लेते हैं। यह काम करेगा, उदाहरण के लिए, cat साथ (और काम से, मुझे कोई तर्क के साथ cat रन की तरह काम मतलब, और बस इनपुट आप इसे देने के साथ भेज देते हैं):

ls | cat 

अपने अनुप्रयोगों के लिए, जहां xargs है इसमें आता है। यह पाइप इनपुट लेता है और इसे निर्दिष्ट कमांड के लिए तर्क के रूप में देता है।

ls | xargs du -sb 

खबरदार कि डिफ़ॉल्ट xargs द्वारा, रिक्त स्थान पर अपने इनपुट तोड़ने इसलिए यदि आपके फ़ाइल नाम रिक्तियाँ इस के रूप में आप चाहते हैं काम नहीं करेगा होगा: तो, आप यह काम की तरह कर सकते हैं। तो, इस विशेष मामले में, यह बेहतर होगा:

du -sb * 
+0

क्या डु -sb * क्या मतलब है ? – Romeno

+0

'*' एक ग्लोब है (या वाइल्डकार्ड जैसा कि आप इसे जानते हैं)। खोल इसे उस मौजूदा निर्देशिका में सभी फ़ाइल (या निर्देशिका, आदि) नामों से प्रतिस्थापित करेगा जो उससे मेल खाते हैं। उदाहरण के लिए, वाई .jpg के साथ समाप्त होने वाली किसी भी फ़ाइल से मेल खाने के लिए '* .jpg' कह सकता है – FatalError

2
$ find . -type d -maxdepth 1 -exec du -sb {} \; 

या

$ ls -d */ | xargs du -sb 
3

उपयोग आदेश प्रतिस्थापन, इस तरह:

du -sb $(ls -d */)