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.

lumbung
sumber
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.

Iain
sumber
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
glenn jackman
sumber
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
Selman Ulug
sumber
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
MILF
sumber
0

Ini solusinya:

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

Solusi yang diposting awalnya di posting ini: Dapatkan semua ekstensi dan jumlah file masing-masing dalam direktori

Blueicefield
sumber
3
Ini adalah hitungan berdasarkan jumlah file, bukan yang saya minta - Saya ingin total berdasarkan ukuran.
barnybug
0

Saya memecahkan menggunakan dua perintah ini:

FILES=$(find . -name '*.c')
stat -c %s ${FILES[@]} | awk '{ sum += $1 } END { print ".c" " " sum }'
c4f4t0r
sumber
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
Isterklister
sumber
0

Coba Kepiting ( http://etia.co.uk/ ) - ini adalah utilitas baris perintah yang memungkinkan Anda untuk menanyakan sistem file menggunakan SQL.

Jacek Lampart
sumber