Menghitung ukuran file total dengan ekstensi di shell


13

Kami memiliki satu set direktori yang berisi indeks lucene. Setiap indeks adalah campuran dari berbagai jenis file (dibedakan berdasarkan ekstensi) misalnya:

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

(sekitar 10 ekstensi berbeda)

Kami ingin mendapatkan total berdasarkan ekstensi file, misalnya:

.frq     21234
.fnm     34757
..

Saya sudah mencoba berbagai kombinasi du / awk / xargs tetapi merasa sulit untuk melakukan hal ini.


Anda memiliki jawaban untuk masalah itu dalam posting ini: serverfault.com/questions/183431/...
Blueicefield

Apakah Anda ingin mengetahui ukuran total dari setiap jenis file atau jumlah total dari setiap jenis file?
user9517

Tolong, total ukuran file.
barnybug

Jawaban:


19

Untuk ekstensi apa pun yang Anda gunakan

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

untuk mendapatkan ukuran file total untuk jenis itu.

Dan setelah berpikir

#!/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

Yang akan menampilkan ukuran dalam byte dari setiap jenis file yang ditemukan.


Terima kasih, sedang mencari sesuatu yang diringkas oleh ekstensi apa pun (karena akan berguna untuk mengurutkan misalnya)
barnybug

Periksa pembaruan saya.
user9517

Terima kasih banyak. awk menghasilkan keluaran ilmiah untuk beberapa angka, dapatkah ini dinonaktifkan: .fdt 3.15152e + 10
barnybug

1
sedikit tweak untuk hanya memberikan angka integer polos: find. -nama "* $ {ft}" -print0 | xargs -0 du -c | grep total | awk '{print $ 1}'
barnybug

1
Mungkin ingin digunakan -inameuntuk membuat case pencarian extenstion file tidak sensitif.
Aaron Copley

6

Dengan bash version4, Anda hanya perlu menelepon find, lsdan awktidak perlu:

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

Skrip ini tidak berfungsi dengan baik dengan nama file dengan karakter tab. Mengubah read name sizeuntuk read size namedan -printf "%f\t%s\n"untuk -printf "%s\t%f\n"harus memperbaikinya.
matt

1
Perhatikan juga bahwa skrip ini tidak berfungsi dengan baik dengan file tanpa ekstensi. Ini akan memperlakukan seluruh nama file sebagai ekstensi. Tambahkan if [ "$name" == "$ext" ]; then ext="*no_extension*"; fisetelah ext=${name##*.}jika Anda perlu mencegahnya. Ini akan menempatkan semua file tanpa ekstensi ke dalam *no_extension*grup (Saya menggunakan *no_extension*karena *bukan karakter yang valid dalam nama file)
matt

4

Setiap kolom kedua dipisahkan oleh .dan bagian terakhir (ekstensi) disimpan dalam array.

#!/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

maka Anda mendapatkan setiap ukuran total ekstensi dalam byte.

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

1

Memperluas skrip Iain dengan versi yang lebih cepat untuk bekerja dengan sejumlah besar file.

#!/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

Saya memecahkan menggunakan dua perintah ini:

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

0

versi jawaban saya untuk pertanyaan:

#!/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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.