मैं फ़ाइलों को कैसे ढूँढूँ और उनके आकार कुल करूँ?


12

मैं फ़ाइलों की एक श्रृंखला (वाइल्डकार्ड अभिव्यक्ति पर आधारित) खोजना चाहता हूं और उनकी डिस्क का उपयोग करना चाहता हूं।

कुछ इस तरह:

$ find . -name 'flibble*' -ctime +90 -exec du -sh {} \;

2.1G    ./flibble_116.log
2.1G    ./flibble_83.log
2.1G    ./flibble_211040_157.log
2.1G    ./flibble3747_51.log

इस काम। लेकिन यह उस परिणाम का उत्पादन नहीं करता है जिसकी मुझे तलाश है। यह प्रत्येक फ़ाइल द्वारा उपयोग किए जाने वाले स्थान को सूचीबद्ध करता है, जैसा findकि उनके माध्यम से पुनरावृत्ति करता है।

मुझे जो चाहिए वह duसभी मिली हुई फ़ाइलों के लिए कुल है।

जवाबों:


12

समाधान

विकल्प -c(या --total) की आपूर्ति करके du(1), आप इसे एक भव्य कुल उत्पादन करने के लिए निर्देश दे सकते हैं। यदि आपका कार्यान्वयन du(1)इनमें से किसी भी विकल्प का समर्थन करता है, तो आप निम्न कमांड का उपयोग करके वांछित प्रभाव प्राप्त कर सकते हैं:

$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +

संपादित करें: ध्यान दें कि यदि फ़ाइलों की संख्या आपके सिस्टम द्वारा अनुमत अधिकतम मापदंडों से अधिक है, तो findभी commandकई बार निष्पादित हो सकती है। कुछ कार्यान्वयन du(1)एक फ़ाइल से फ़ाइलनाम को पढ़ने का भी समर्थन करते हैं, जो उल्लिखित सीमा से ग्रस्त नहीं है:

$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames

व्याख्या

के शब्दों के बीच का अंतर -exec command {} \;और -exec command {} +वह इस प्रकार है:

  • command {} \;commandप्रत्येक परिणाम के लिए एक बार निष्पादित होता है find। परिणाम का पथनाम इसके बजाय पारित किया जाता है {}

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} \;
    1
    2
    3
  • command {} +commandजब सभी परिणाम पुनर्प्राप्त कर लिए गए हों, तो निष्पादित होता है। परिणामों के मार्गनाम इसके बजाय पारित किए जाते हैं {}

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} +
    1 2 3

-print0विकल्प का कारण बनता है find(1)के लिए मानक आउटपुट अशक्त चरित्र के द्वारा अलग पाया फ़ाइल नाम मुद्रित करने के लिए, और --files0-fromविकल्प की वजह से du(1)अशक्त-अलग फ़ाइल नाम पढ़ने के लिए। नई पंक्ति वर्ण के विपरीत, नल वर्ण फ़ाइल नाम में प्रकट नहीं हो सकता है, इसलिए आउटपुट असंदिग्ध है।

के विकल्पों के बारे में अधिक जानने के लिए du(1)और find(1), आप संबंधित manpages से परामर्श करना चाहिए:

$ man du
$ man find

2
यदि कमांड लाइन तर्क सीमा की संख्या के कारण फाइलों की संख्या महत्वपूर्ण है (1K +) तो आप कई योगों के साथ समाप्त हो सकते हैं।
नौकाचू

मैं @ साइकोच की पुष्टि कर सकता हूं, मुझे 30k से अधिक फ़ाइलों के आकार का आकलन करने की कोशिश करते समय समस्या हुई।
एड्रिएन एच

यदि यह एक समस्या है, तो कुछ कार्यान्वयन du(1)फ़ाइल से फ़ाइलनाम पढ़ने का भी समर्थन करते हैं find 1 2 3 -maxdepth 0 -print0 > filenames; du -shc --files0-from=filenames:।
विटिको

4

इसे इस्तेमाल करे:

du -c `find . -name 'flibble*' -ctime +90` | tail -1

मूल आदेश ड्यू वन तर्क दे रहा है, फिर इसे निष्पादित कर रहा है, जब तक कि यह सभी तर्कों से नहीं गुजरता। इस तरह, आप बस इसे एक ही बार में सभी तर्क दे रहे हैं, फिर अलग-अलग आकार काट रहे हैं, और केवल कुल छोड़ रहे हैं। यदि आप चाहें तो प्रत्येक फ़ाइल का आकार दिखाने के लिए आप पाइप और पूंछ को हटा सकते हैं।


यह रिक्त स्थान वाले पथनामों के साथ सही परिणाम नहीं देगा। ऐसा करने का सही तरीका -exec du -c {} +विकल्प का उपयोग कर रहा है find, जो कि बिना नाम वाले मार्ग को पास करेगा du
विटिको

4

आप यह कोशिश कर सकते हैं:

find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total

2

मेरे पास findखुद आकार का प्रिंट आउट होगा, और कुल गणना करने के लिए दूसरे उपकरण का उपयोग करना होगा:

find . -name 'flibble*' -ctime +90 -printf "%s\n" |
perl -lnE '$sum += $_} END {say $sum'

यदि आप फ़ाइल नाम देखना चाहते हैं:

find . -name 'flibble*' -ctime +90 -printf "%s\t%p\n" |
perl -apE '$sum += $F[0]} END {say $sum'

1

एक लाइनर जो अधिकांश प्रणालियों पर एक गीगाबाइट कुल प्राप्त करने के लिए काम करना चाहिए:

echo "$(( ($(find . -name 'flibble*' -ctime +90 -type f -printf '%k+' )0)/1024/1024 )) GB"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.