निर्देशिका में सभी फ़ाइलों की सामग्री का कुल आकार [बंद]


103

जब मैं उपयोग करता हूं lsया du, मुझे प्रत्येक स्थान पर डिस्क स्थान की मात्रा प्राप्त होती है।

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


1
lsवास्तव में प्रत्येक फ़ाइल में बाइट्स की संख्या दिखाती है, न कि डिस्क स्थान की मात्रा। क्या यह आपकी आवश्यकताओं के लिए पर्याप्त है?
ग्रेग हेवगिल

3
ध्यान दें कि duइस प्रश्न का उत्तर देने के लिए उपयोग नहीं किया जा सकता है। यह डिस्क पर डिस्क स्थान की मात्रा (फाइलों का डेटा और सहायक फ़ाइल सिस्टम मेटा-सूचना का आकार) पर दिखाई देता है। duउत्पादन सभी फ़ाइलों का कुल आकार से भी छोटे हो सकता है। ऐसा तब हो सकता है जब फ़ाइल सिस्टम डिस्क पर संपीड़ित डेटा को संग्रहीत कर सकता है या यदि हार्ड लिंक का उपयोग किया जाता है। सही जवाब lsऔर पर आधारित हैं find। द्वारा उत्तर देखें नेल्सन और द्वारा bytepan : यहाँ, या क्या यह उत्तर unix.stackexchange.com/a/471061/152606
anton_rh

जवाबों:


108

यदि आप 'स्पष्ट आकार' चाहते हैं (जो प्रत्येक फ़ाइल में बाइट्स की संख्या है), डिस्क पर फ़ाइलों द्वारा उठाए गए आकार की नहीं, तो विकल्प -bया --bytesविकल्प का उपयोग करें (यदि आपको जीएनयू कोर्यूटिल्स के साथ लिनक्स सिस्टम मिला है ):

% du -sbh <directory>

1
मेरे नए लाल टोपी बॉक्स पर काम करता है, दुर्भाग्य से मेरे एम्बेडेड देव बॉक्स पर नहीं।
आर्थर उल्फेल्ट

3
क्या मानव-पठनीय प्रारूप में "स्पष्ट आकार" दिखाने का एक आसान तरीका है? उपयोग करते समय du -shb(इस उत्तर द्वारा सुझाए अनुसार), -bसेटिंग सेटिंग को ओवरराइड करने लगती है -h
मथियास ब्येनेंस

6
@MathiasBynens झंडे के क्रम को उलट दें (यानी du -sbh <dir>)। मेरे लिये कार्य करता है।
लुइस ई।

2
@ मैथियास बिएनेंसdu -sh --apparent-size /dir/
जोंगोसी

2
@ अरकडी मैंने सेंटोस और उबंटू पर आपके समाधान की कोशिश की है, और एक छोटी सी त्रुटि है। आप "डुएसभ" चाहते हैं। "-एच" ध्वज अंतिम आना चाहिए।
TheJollySin

46

उपयोग करें du -sb:

du -sb DIR

वैकल्पिक रूप से, hअधिक उपयोगकर्ता-अनुकूल आउटपुट के लिए विकल्प जोड़ें :

du -sbh DIR

4
-b को MacOS 'du
lynxoid

3
@lynxoid: आप काढ़ा के साथ GNU संस्करण स्थापित कर सकते हैं brew install coreutils:। यह कमांड के रूप में उपलब्ध होगा gdu
neu242

1
काम नहीं करता। ls-> file.gz hardlink-to-file.gzstat -c %s file.gz-> 9657212stat -c %s hardlink-to-file.gz-> 9657212du -sb-> 9661308। यह निश्चित रूप से सामग्री का कुल आकार नहीं है, लेकिन डिस्क पर निर्देशिका आकार लेती है।
anton_rh

24

सीडी से निर्देशिका, फिर:

du -sh

FTW!

मूल रूप से इसके बारे में यहाँ लिखा है: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/


1
यह सरल और काम करता है! धन्यवाद। कभी-कभी, मैं -Lविकल्प जोड़ना पसंद करता हूं ताकि duसहानुभूति निम्नानुसार हो।
conradkleinespel

2
मेरे लिए काम करता है (OS X पर)
sam boosalis

2
यह सरल है और काम नहीं करता है। यह उस स्थान को प्रिंट करता है जो निर्देशिका डिस्क पर ले जाती है, न कि उस सामग्री का कुल आकार जो प्रत्येक फ़ाइल को खोलकर और बाइट्स की गणना करके गणना की जा सकती है।
anton_rh

17

बस एक विकल्प:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d' निर्देशिकाओं को बाहर करेगा।


4
बिल्कुल सही, भी "छिपा फ़ाइलें" प्राप्त करने के लिए (कुछ भी अवधि के साथ शुरू) -एक परम जोड़ने
Nicholi

एक विशिष्ट फ़ाइल प्रकार (इस मामले में, PNG) के लिए पृथक और एमबी में अधिक पठनीयता के लिए व्यक्त: ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice

यह एक सही उत्तर है। duइस समाधान के विपरीत वास्तव में फाइलों में सभी डेटा का कुल आकार गिना जाता है जैसे कि वे एक-एक करके खोले गए थे और उनके बाइट्स गिने गए थे। लेकिन हां, -Aछिपे हुए फाइलों को गिनने के लिए पैरामीटर जोड़ना आवश्यक है।
anton_rh

13

स्टेट का "% s" प्रारूप आपको फ़ाइल में बाइट्स की वास्तविक संख्या देता है।

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

संख्याओं के लिए अपनी पसंदीदा विधि का विकल्प देने के लिए स्वतंत्र महसूस करें ।


4
अधिमानतः कुछ फ़ाइल नामों (रिक्त स्थान वाले) के साथ समस्याओं से बचने के लिए "ढूँढें। -Type f -print0 | xargs -0 ..." का उपयोग करें।
ह्वॉल्ड

1
हाँ, अच्छी बात है। अगर यह bsd 4.2 में नहीं था, तो मुझे इसका उपयोग करने की याद नहीं है :-(
नेल्सन

3
find -print0और xargs -0रिक्त स्थान वाले फ़ाइल नाम के लिए आवश्यक हैं। OS X चाहता है stat -f %z
कोर्नेल

1
(ध्यान दें कि स्टेट विरल फाइलों के साथ काम करता है, फ़ाइल के बड़े नाममात्र आकार की रिपोर्टिंग करता है और duरिपोर्ट की तरह डिस्क पर उपयोग किए जाने वाले छोटे ब्लॉक नहीं ।)
नेल्सन

1
यहां कई अन्य उत्तरों के विपरीत, जो गलती से duउपयोगिता का उपयोग करते हैं , यह उत्तर सही है। यह यहां जवाब देने के लिए बहुत समान है: unix.stackexchange.com/a/471061/152606 । लेकिन मैं ! -type dइसके बजाय -type fसिम्बलिंक को गिनने के लिए उपयोग करूँगा (स्वयं सिम्लिंक का आकार (आमतौर पर कुछ बाइट्स), फ़ाइल का आकार जो इसे इंगित करता है)।
anton_rh

3

यदि आप इमबेडेड सिस्टम में बिजीबॉक्स के "डू" का उपयोग करते हैं, तो आप डु के साथ एक सटीक बाइट्स नहीं प्राप्त कर सकते हैं, केवल किबेट्स आप प्राप्त कर सकते हैं।

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)

3

जब एक फ़ोल्डर बनाया जाता है, तो कई लिनक्स फाइल सिस्टम कुछ मेटाडेटा को निर्देशिका के बारे में संग्रहीत करने के लिए 4096 बाइट आवंटित करते हैं। जैसे-जैसे निर्देशिका बढ़ती जाती है, यह स्थान 4096 बाइट्स की संख्या से बढ़ जाता है।

डु कमांड (साथ या बिना बी विकल्प) इस स्थान को गिनें , क्योंकि आप टाइपिंग देख सकते हैं:

mkdir test && du -b test

आपके पास खाली डायर के लिए 4096 बाइट का परिणाम होगा। इसलिए, यदि आप dir के अंदर 10000 बाइट्स की 2 फाइलें डालते हैं, तो du -sb द्वारा दी गई कुल राशि 24096 बाइट्स होगी।

यदि आप प्रश्न को ध्यान से पढ़ते हैं, तो यह नहीं पूछा जाता है। प्रश्नकर्ता ने पूछा:

फ़ाइलों और उपनिर्देशिकाओं में सभी डेटा का कुल योग मुझे मिलेगा यदि मैंने प्रत्येक फ़ाइल को खोला और बाइट्स गिना

कि ऊपर के उदाहरण में 20000 बाइट्स होनी चाहिए, 24096 नहीं।

इसलिए, सही उत्तर IMHO नेल्सन के उत्तर और होव्लड सुझाव का मिश्रण हो सकता है जिसमें रिक्त स्थान वाले फ़ाइलनाम को संभालने के लिए सुझाव दिया गया है:

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'

2

बाइट्स में "फ़ाइलों और उपनिर्देशिकाओं में सभी डेटा का कुल योग" प्राप्त करने के लिए कम से कम तीन तरीके हैं जो विंडोज के लिए लिनक्स / यूनिक्स और गिट बैश दोनों में काम करते हैं, जो कि औसत से सबसे तेज से सबसे धीमी गति से नीचे सूचीबद्ध हैं। आपके संदर्भ के लिए, वे एक काफी गहरी फ़ाइल सिस्टम ( docrootएक Magento 2 एंटरप्राइज़ स्थापना में 30,027 निर्देशिकाओं में 71,158 फ़ाइलों को शामिल करते हुए) के मूल में निष्पादित किए गए थे ।

1।

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2।

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes

real    0m0.256s
user    0m0.164s
sys     0m0.196s

3।

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes

real    0m0.553s
user    0m0.308s
sys     0m0.416s


ये दोनों भी काम करते हैं, लेकिन वे उन आदेशों पर भरोसा करते हैं जो विंडोज के लिए गिट बैश पर मौजूद नहीं हैं:

1।

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2।

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s


आप केवल वर्तमान निर्देशिका के लिए कुल चाहते हैं, तो जोड़ने -maxdepth 1के लिए find


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

$ du -sbh
832M    .

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471

$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133

1
विंडोज के लिए गिट बैश के बारे में, - सिगविन के मामले में, पैकेज dcका हिस्सा है bc, इसलिए इसे प्राप्त करने के लिएdc इसे स्थापित करने की आवश्यकता है bc
रुविम

1

Win32 डॉस के लिए, आप कर सकते हैं:

c:> dir / sc: \ directory \ you चाहते हैं

और penultimate लाइन आपको बताएगी कि फाइल कितने बाइट्स लेती हैं।

मुझे पता है कि यह सभी फ़ाइलों और निर्देशिकाओं को पढ़ता है, लेकिन कुछ स्थितियों में तेजी से काम करता है।


1

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

find . -type f -printf "%s + " | dc -e0 -f- -ep

यहाँ जैसे के findलिए कमांड का क्रम उत्पन्न करता है । हालांकि, पूरा कार्यक्रम जैसा होना चाहिए (पोस्टफिक्स नोटेशन याद रखें)।dc123 + 456 + 11 +0 123 + 456 + 11 + p

इसलिए, पूरा कार्यक्रम प्राप्त करने के लिए हमें 0स्टड से अनुक्रम निष्पादित करने से पहले स्टैक पर रखना होगा , और निष्पादित करने के बाद शीर्ष नंबर प्रिंट करना होगा ( pअंत में कमांड)। हम इसे dcविकल्पों के माध्यम से प्राप्त करते हैं:

  1. -e0बस के लिए शॉर्टकट है -e '0'कि कहते हैं 0ढेर पर,
  2. -f-स्टड से आदेशों को पढ़ने और निष्पादित करने के लिए है (जो findयहां उत्पन्न होता है),
  3. -epपरिणाम प्रिंट करने के लिए है ( -e 'p')।

MiB में आकार को प्रिंट करने के लिए जैसे 284.06 MiBहम -e '2 k 1024 / 1024 / n [ MiB] p'बिंदु 3 में उपयोग कर सकते हैं (अधिकांश रिक्त स्थान वैकल्पिक हैं)।


1

इससे मदद मिल सकती है:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

उपरोक्त कमांड निर्देशिका आकार को छोड़कर सभी फ़ाइलों का योग करेगा।


1
ध्यान दें कि यह समाधान बरुन के उत्तर के समान है । लेकिन यह समाधान उप-निर्देशिका में फ़ाइलों का योग नहीं करता है।
रुविम

1
@ruvim, यह छिपी हुई फ़ाइलों को भी योग नहीं करता है। छिपी हुई फ़ाइलों को योग करने के लिए, -Aविकल्प को जोड़ना होगा ls
anton_rh

0

उपयोग:

$ du -ckx <DIR> | grep total | awk '{print $1}'

जहाँ <DIR> वह निर्देशिका है जिसका आप निरीक्षण करना चाहते हैं।

'-C' आपको ग्रैंड टोटल डेटा देता है जिसे कमांड के 'grep टोटल' भाग का उपयोग करके निकाला जाता है, और Kbytes में काउंट को awk कमांड से निकाला जाता है।

यहां केवल एक ही चेतावनी है यदि आपके पास "कुल" पाठ से युक्त एक उपनिर्देशिका है तो यह थूक से बाहर निकल जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.