2009-03-01 16 views
51

में फ़ाइलों के आकार की गणना करें मैं केवल सभी फाइलों (निर्देशिका पेड़ में) के बाइट्स में कुल आकार की गणना करने की कोशिश कर रहा हूं, केवल शेल का उपयोग करके फ़ाइल नाम पैटर्न से मेल खाता हूं। यह मेरे पास अब तक है:खोल

ढूंढ-नाम * .undo -exec stat -c% s {} \; | अजीब '{कुल + = $ 1} अंत {प्रिंट कुल}'

क्या ऐसा करने का कोई आसान तरीका है? मुझे लगता है कि एक साधारण डु या स्विच होना चाहिए जो मेरे लिए यह करता है लेकिन मुझे कोई नहीं मिल रहा है।

स्पष्ट मैं एक निर्देशिका वृक्ष का मतलब है जिसके तहत कहीं भी एक पैटर्न मिलान की कुल फ़ाइलें करना चाहते हैं होना करने के लिए

डु -bs * .undo

क्योंकि यह केवल फ़ाइलों का मिलान

काम नहीं करेगा वर्तमान निर्देशिका में।

+0

वैसे भी, 'du' (या' ls') कुछ हजारों फ़ाइलों ("तर्क सूची बहुत लंबी" त्रुटि से ऊपर काम नहीं करेगा)। –

उत्तर

94

प्रयास करें:

find . -name "*.undo" -ls | awk '{total += $7} END {print total}' 

अपने सिस्टम पर फ़ाइल का आकार find -ls उत्पादन में सातवें क्षेत्र है। यदि आपका find … -ls आउटपुट अलग है, तो समायोजित करें।

इस संस्करण में, मौजूदा निर्देशिका जानकारी (फ़ाइल आकार) का उपयोग करके और अंतर्निहित एलएस सुविधा की खोज प्रक्रिया कुशलताओं या फ़ाइल I/o से परहेज करना चाहिए।

+2

यह काम करना चाहिए, लेकिन खोजने के लिए -ls विकल्प, और अजीब, इस कार्य के लिए अधिक है। –

+9

बिल्कुल ज्यादा नहीं है। – vladr

+4

यदि "* .undo" ग्लोब से मेल खाने वाली निर्देशिकाएं हैं तो मैं गलत कुल से रोकने के लिए खोज कमांड में "-type f" जोड़ दूंगा। –

-3

du (डिस्क उपयोग) कमांड की जांच करें।

18
du -c *pattern* 

यह आउटपुट की अंतिम पंक्ति पर कुल प्रिंट करेगा।

+1

और आखिरी पंक्ति के अलावा सभी को ट्रिम करने के लिए पूंछ का उपयोग करें। +1। =] – strager

+6

यह केवल उन फ़ाइलों को मिलेगा जो वर्तमान निर्देशिका में पैटर्न से मेल खाते हैं, हालांकि - है ना? –

+0

आप '*/*। Undo' जैसे पैटर्न का उपयोग कर सकते हैं ... हालांकि यह केवल पूर्ववत एक्सटेंशन वाले फाइलें पायेगा जो एक फ़ोल्डर गहरे हैं ... वर्तमान निर्देशिका में भी कोई भी नहीं मिलेगा। – Kasapo

8
find -name '*.undo' -exec wc -c {} + | tail -n 1 

, यदि आप बहुत सारी फ़ाइलें नहीं है फाइलों में बाइट्स की वास्तविक कुल संख्या देना चाहिए (जहां "बहुत सारे" एक बहुत बड़ी संख्या में होने जा रहा है, शायद हजारों में)। या आप बस संख्या अकेले प्राप्त करने के लिए,

find -name '*.undo' -exec wc -c {} + | tail -n 1 | cut -d' ' -f 1 
+0

आपको '* .undo', "* .undo", \ *। पूर्ववत, या इसी तरह का उद्धरण देना चाहिए; अन्यथा, यदि वर्तमान निर्देशिका में a.undo फ़ाइल मौजूद है तो आपको गलत परिणाम मिलेंगे। – ephemient

5

अजगर ज्यादातर Linux वितरण का हिस्सा है चाहते हैं।

import os 
import fnmatch 
size= 0 
for path, dirs, files in os.walk('.'): 
    for f in files: 
     if fnmatch.fnmatch(f,'*.py'): 
      fileSize= os.path.getsize(os.path.join(path,f)) 
      print f, fileSize 
      size += fileSize 
print size 

लंबे, लेकिन पूरी तरह स्पष्ट और अत्यधिक एक्स्टेंसिबल।

35

zsh के साथ, आप करने के लिए ग्लोबिंग विस्तारित उपयोग कर सकते हैं:।

डु -c **/* पूर्ववत

+4

और मछली और बैश 4.0 भी! – ephemient

+5

और 'du -ch **/*। पूर्ववत' मानव पठनीय फ़ाइल आकार प्राप्त करने के लिए ... – student

22
find -name *.undo -print0 | du -hc --files0-from=- 
+0

यह सूचियां सभी फाइलें। क्या कुल दिखाने का कोई तरीका है? भले ही, मुझे लगता है कि यह एक 'सही उत्तर' उम्मीदवार है। –

+3

मुझे यह पसंद है क्योंकि यह आकार 'मानव पठनीय' दिखाता है। @ टाइलर कोलिअर केवल कुल दिखाने के लिए पूंछ का उपयोग करें: 'find -type f -name '* .undo' -print0 | du -hc --files0-from = - | tail -n 1' –

+0

यह सबसे अच्छा जवाब है जिसे मैंने कभी ऐसा करने के लिए देखा है लिनक्स पर ... i टीएस मैंने देखा है कि किसी भी अन्य उत्तर की तुलना में 1,000 गुना तेजी से निष्पादित करता है, क्योंकि फाइल पर डु बहुत तेजी से निष्पादित करता है, साथ ही यह मानव पठनीय शर्तों में आउटपुट देता है – Myforwik

3
find -name '*.undo' -print0 | du -hc --files0-from=- | tail -n 1 

gerdemb की और strager के योगदान से एक साथ रखो। du -cb का प्रयोग बाइट्स प्रदर्शित करना चाहिए।

9

मैं भी इस समस्या को देख रहा हूं (केवल एक साल बाद ...) - केवल यह पृष्ठ मिला।

find /mnt/iso -name *.avi -printf "%s\n" | paste -sd+ - | bc 

यह/MNT से नीचे के सभी उप-फ़ोल्डर में सभी .avi फ़ाइलों का कुल आकार वापस आ जाएगी/आईएसओ

:

कुछ है कि मैं काम करता है (मेरे लिए) पाया पीछा कर रहा है Shell command to sum integers, one per line?

बस को जोड़ने के लिए - बस मामले में एक फ़ोल्डर खोज पद से मेल खाता है - यह एक अच्छा विचार खोजने के आदेश में -type f उपयोग करने के लिए है: -

मैं पेस्ट आदेश के लिए radoulov को ऋण देना है इस पृष्ठ को देखें भी।

0

इस सरल के बारे में कैसे।

find ./ -name *.undo | xargs wc 
2

मैं केवल संख्या प्राप्त करने के इस तरह डु आदेश का उपयोग करें:

du file_list | awk '{s+=$1} END {print s}' 
0

या, आप यह कर सकते हैं:

dir=$1 

for file in $dir/* ; do 

length_file=`stat -c %s $file` 
echo "File $file has length $length_file" 
length_total=`expr $length_total + $length_file` 

done 

echo "Total length: $length_total ." 

कहाँ स्टेट एक फ़ाइल या फाइल सिस्टम स्थिति प्रदर्शित करता है । तर्क-सी का मतलब डिफ़ॉल्ट प्रारूप के बजाय निर्दिष्ट प्रारूप का उपयोग करना है, और प्रारूप अनुक्रम $ s बाइट्स के कुल आकार के प्रदर्शन की अनुमति देता है।

expr 

बस एक अभिव्यक्ति का मूल्यांकन करता है।

0

पर्ल एक लाइनर:

find . -name "*.undo" -ls | perl -lane '$t += $F[6]; END{print $t}' 

@F autosplit सरणी सूचकांक $F[0] पर शुरू होता है, जबकि awk क्षेत्रों $ 1 के साथ शुरू, इसलिए $F[6] बजाय awk के $7

0

डु -c का प्रयोग किया जाता है | awk '/ ./{line=$0} अंत {प्रिंट $ 1}'

0

मुझे लगता है कि xargs के साथ संस्करण को हटाया जा सकता है (सरलीकृत) ls -1 * .undo | xargs wc