การคำนวณขนาดไฟล์ทั้งหมดโดยการขยายในเปลือก


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

กรุณารวมขนาดไฟล์
barnybug

คำตอบ:


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

ซึ่งจะส่งออกขนาดเป็นไบต์ของแต่ละประเภทไฟล์ที่พบ


ขอขอบคุณที่ได้รับการมองหาสิ่งที่สรุปโดยการขยายใด ๆ (ตามที่มันจะมีประโยชน์ในการแล้วเรียงตัวอย่าง)
barnybug

ตรวจสอบการอัปเดตของฉัน
user9517

ขอบคุณมาก awk สร้างผลลัพธ์ทางวิทยาศาสตร์สำหรับตัวเลขบางตัวซึ่งสามารถปิดใช้งานได้: .fdt 3.15152e + 10
barnybug

1
tweaked เล็กน้อยเพียงแค่ให้ตัวเลขจำนวนเต็มธรรมดา: ค้นหา -name "* $ {ft}" -print0 | xargs -0 du -c | ผลรวม grep awk '{พิมพ์ $ 1}'
barnybug

1
อาจต้องการใช้-inameเพื่อทำให้กรณีการค้นหาไฟล์ไม่สำคัญ
Aaron Copley

6

ด้วยการทุบตี version4 คุณเพียงแค่ต้องโทร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

ขยายสคริปต์ของ Iain ด้วยเวอร์ชันที่เร็วขึ้นสำหรับการทำงานกับไฟล์จำนวนมาก

#!/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
นี่คือการนับจำนวนไฟล์ไม่ใช่สิ่งที่ฉันถาม - ฉันต้องการทั้งหมดตามขนาด
barnybug

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.