शेल में एक्सटेंशन द्वारा कुल फ़ाइल आकार की गणना करना


13

हमारे पास ल्यूसिन इंडेक्स वाली निर्देशिकाओं का एक सेट है। प्रत्येक सूचकांक विभिन्न फ़ाइल प्रकारों का मिश्रण है (विस्तार द्वारा विभेदित) जैसे:

0/index/_2z6.frq
0/index/_2z6.fnm
..
1/index/_1sq.frq
1/index/_1sq.fnm
..

(यह 10 अलग-अलग एक्सटेंशनों के बारे में है)

हम फ़ाइल एक्सटेंशन द्वारा कुल प्राप्त करना चाहते हैं, जैसे:

.frq     21234
.fnm     34757
..

मैंने du / awk / xargs के विभिन्न संयोजनों की कोशिश की है, लेकिन यह वास्तव में ऐसा करने के लिए मुश्किल लग रहा है।


इस पोस्ट में उस समस्या के लिए आपके पास जवाब है: serverfault.com/questions/183431/…
Blueicefield

क्या आप प्रत्येक प्रकार की फ़ाइल का कुल आकार या प्रत्येक प्रकार की फ़ाइल की कुल संख्या जानना चाहते हैं?
user9517

कुल फ़ाइल आकार कृपया।
बरबग

जवाबों:


19

किसी भी एक्सटेंशन के लिए आप एक उपयोग करें

find /path -name '*.frq' -exec ls -l {} \; | awk '{ Total += $5} END { print Total }'

उस प्रकार के लिए कुल फ़ाइल आकार प्राप्त करने के लिए।

और कुछ सोच के बाद

#!/bin/bash

ftypes=$(find . -type f | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq)

for ft in $ftypes
do
    echo -n "$ft "
    find . -name "*${ft}" -exec ls -l {} \; | awk '{total += $5} END {print total}'
done

जो आकार में मिली प्रत्येक फ़ाइल के बाइट्स में आकार को आउटपुट करेगा।


धन्यवाद, किसी चीज की तलाश है जिसे किसी भी विस्तार से संक्षेपित किया गया है (जैसा कि उदाहरण के लिए तब
छांटना

मेरे अपडेट की जाँच करें।
user9517

बहुत धन्यवाद। awk कुछ नंबरों के लिए वैज्ञानिक उत्पादन करता है, क्या इसे निष्क्रिय किया जा सकता है: .fdt 3.15152e + 10
barnybug

1
थोड़ा सा सादे पूर्णांक संख्या देने के लिए tweaked: मिल। -name "* $ {ft}" -print0 | xargs -0 डु-सी | grep कुल | awk '{प्रिंट $ 1}'
barnybug

1
-inameफ़ाइल विलोपन खोज मामले को असंवेदनशील बनाने के लिए उपयोग करना चाह सकते हैं ।
आरोन कोपले

6

संस्करण 4 के साथ, आपको केवल कॉल करने की आवश्यकता है find, lsऔर awkआवश्यक नहीं:

declare -A ary

while IFS=$'\t' read name size; do 
  ext=${name##*.}
  ((ary[$ext] += size))
done < <(find . -type f  -printf "%f\t%s\n")

for key in "${!ary[@]}"; do 
  printf "%s\t%s\n" "$key" "${ary[$key]}"
done

यह स्क्रिप्ट टैब नामों के साथ फ़ाइल नामों के साथ अच्छी तरह से काम नहीं करती है। बदलने read name sizeके लिए read size nameऔर -printf "%f\t%s\n"करने के लिए -printf "%s\t%f\n"इसे ठीक करना चाहिए।
मैट

1
यह भी ध्यान दें कि यह स्क्रिप्ट विस्तार के बिना फाइलों के साथ अच्छी तरह से काम नहीं करती है। यह संपूर्ण फ़ाइल नाम को एक्सटेंशन के रूप में मानेगा। यदि आपको इसे रोकने की आवश्यकता है, तो इसके if [ "$name" == "$ext" ]; then ext="*no_extension*"; fiबाद जोड़ें ext=${name##*.}। यह *no_extension*समूह में विस्तार के बिना सभी फ़ाइलों को डाल देगा (मैं फ़ाइल नाम में एक वैध चरित्र नहीं होने के *no_extension*कारण उपयोग कर रहा हूं *)
मैट

4

.सरणी में सहेजे गए अंतिम और अंतिम भाग (विस्तार) द्वारा विभाजित प्रत्येक दूसरा स्तंभ ।

#!/bin/bash

find . -type f -printf "%s\t%f\n" | awk '
{
 split($2, ext, ".")
 e = ext[length(ext)]
 size[e] += $1
}

END{
 for(i in size)
   print size[i], i
}' | sort -n

तब आपको बाइट्स में हर एक्सटेंशन कुल आकार मिला।

60055 gemspec
321991 txt
2075312 html
2745143 rb
13387264 gem
47196526 jar

1

बड़ी संख्या में फ़ाइलों के साथ काम करने के लिए एक तेज़ संस्करण के साथ इयान की स्क्रिप्ट पर विस्तार करना।

#!/bin/bash

ftypes=$(find . -type f | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq)

for ft in $ftypes
do
    echo -ne "$ft\t"
    find . -name "*${ft}" -exec du -bcsh '{}' + | tail -1 | sed 's/\stotal//'
done

0

इसका समाधान है:

find . -type f | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq -c | sort -n

समाधान मूल रूप से इस पोस्ट पर पोस्ट किया गया: एक निर्देशिका में सभी एक्सटेंशन और उनके संबंधित फ़ाइल गणना प्राप्त करें


3
यह फाइलों की संख्या से एक गिनती है, न कि मैं जो पूछ रहा था - मैं आकार से कुल चाहूंगा।
बरनीबाग

0

मैंने इस दो आदेशों का उपयोग करके हल किया:

FILES=$(find . -name '*.c')
stat -c %s ${FILES[@]} | awk '{ sum += $1 } END { print ".c" " " sum }'

0

प्रश्न के उत्तर का मेरा संस्करण:

#!/bin/bash

date >  get_size.log
# Lists all files
find . -type f -printf "%s\t%f\n" | grep -E ".*\.[a-zA-Z0-9]*$" | sort -h | awk  '
{
        split($2, ext, ".")
        e = ext[length(ext)]
        # Checks that one extension could be found
        if(length(e) < length($2)) {
                # Check that file size are bigger than 0
                if($i > 0) {
                        # Check that extension not are integer
                        if(!(e ~/^[0-9]+$/)) {
                                size[e] += $1
                        }
                }
        }
        if(length(e) == length($2)) {
                size["blandat"] += $1
        }
}

END{
 for(i in size)
   print size[i], i
}' | sort -n >> get_size.log
echo
echo
echo The result are in file get_size.log

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