শেলের এক্সটেনশান দ্বারা মোট ফাইলের আকার গণনা করা হচ্ছে


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 এর বিভিন্ন সংমিশ্রণ চেষ্টা করেছি তবে ঠিক এটি করা কঠিন বলে মনে হচ্ছে।


এই পোস্টে এই সমস্যার উত্তর আপনার কাছে রয়েছে: সার্ভারফ্লাট
প্রশ্ন

আপনি কি প্রতিটি ধরণের ফাইলের মোট আকার বা প্রতিটি ধরণের ফাইলের মোট সংখ্যা জানতে চান?
ব্যবহারকারী 9517

মোট ফাইল আকার।
বার্নিবাগ

উত্তর:


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

যা পাওয়া প্রতিটি ফাইল টাইপের বাইটে আকার আউটপুট দেবে।


ধন্যবাদ, এমন কোনও কিছু সন্ধান করছিল যা সংক্ষিপ্ত
আকারে

আমার আপডেট পরীক্ষা করে দেখুন।
ব্যবহারকারী 9517

দুর্দান্ত ধন্যবাদ awk কিছু সংখ্যার জন্য বৈজ্ঞানিক আউটপুট উত্পাদন করে, এটি কি অক্ষম করা যেতে পারে: .fdt 3.15152e + 10
বার্নব্যাগ

1
কেবল প্লেইন পূর্ণসংখ্যার সংখ্যা দিতে সামান্য টুইট করা হয়েছে: সন্ধান করুন। -নাম "* $ {ft}" -প্রিন্ট 0 | xargs -0 du -c | গ্রেপ মোট | awk '{মুদ্রণ $ 1}'
বার্নিবাগ 14

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
এটি ফাইলের সংখ্যার দ্বারা একটি গণনা, আমি যা জিজ্ঞেস করছিলাম তা নয় - আমি মোট আকার অনুসারে চাই।
বার্নিবাগ 14

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

0

ক্র্যাব চেষ্টা করুন ( http://etia.co.uk/ ) - এটি একটি কমান্ড-লাইন ইউটিলিটি যা আপনাকে এসকিউএল ব্যবহার করে ফাইল সিস্টেমটি অনুসন্ধান করতে সহায়তা করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.