Obliczanie całkowitego rozmiaru pliku według rozszerzenia w powłoce


13

Mamy zestaw katalogów zawierających indeksy lucenu. Każdy indeks jest mieszanką różnych typów plików (w zależności od rozszerzenia), np .:

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

(to około 10 różnych rozszerzeń)

Chcielibyśmy uzyskać sumę według rozszerzenia pliku, np .:

.frq     21234
.fnm     34757
..

Próbowałem różnych kombinacji du / awk / xargs, ale znalezienie tego jest trudne.


Odpowiedź na ten problem znajdziesz w tym poście: serverfault.com/questions/183431
Blueicefield,

Czy chcesz poznać całkowity rozmiar każdego typu pliku lub całkowitą liczbę każdego rodzaju pliku?
user9517

Całkowity rozmiar pliku proszę.
barnybug

Odpowiedzi:


19

Do dowolnego rozszerzenia możesz użyć

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

aby uzyskać całkowity rozmiar pliku dla tego typu.

I po namyśle

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

Który wyświetli rozmiar w bajtach każdego znalezionego typu pliku.


Dzięki, szukałem czegoś, co podsumowałoby dowolne rozszerzenie (jak przydałoby się np.
Posortować

Sprawdź moją aktualizację.
user9517

wielkie dzięki. awk produkuje wyniki naukowe dla niektórych liczb, czy można to wyłączyć: .fdt 3.15152e + 10
barnybug

1
lekko poprawione, aby podawać zwykłe liczby całkowite: znajdź. -nazwa „* $ {ft}” -print0 | xargs -0 du -c | grep ogółem | awk '{print $ 1}'
barnybug

1
Może chcesz użyć, -inameaby rozróżnić wielkość liter w wyszukiwaniu rozszerzenia pliku.
Aaron Copley,

6

Z bash version4, wystarczy do wywołania find, lsa awknie jest to konieczne:

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

Ten skrypt nie działa dobrze z nazwami plików ze znakiem tabulacji. Zmieniających read name sizesię read size namei -printf "%f\t%s\n"do -printf "%s\t%f\n"powinien to naprawić.
mat

1
Zauważ też, że ten skrypt nie działa dobrze z plikami bez rozszerzenia. Traktuje całą nazwę pliku jako rozszerzenie. Dodaj if [ "$name" == "$ext" ]; then ext="*no_extension*"; fipo, ext=${name##*.}jeśli chcesz temu zapobiec. Spowoduje to umieszczenie wszystkich plików bez rozszerzenia w *no_extension*grupie (używam, *no_extension*ponieważ *nie jest prawidłowym znakiem w nazwie pliku)
mat

4

Co druga kolumna podzielona przez .ostatnią część (rozszerzenie) zapisaną w tablicy.

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

to masz całkowity rozmiar każdego rozszerzenia w bajtach.

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

1

Rozszerzenie na skrypt Iaina z szybszą wersją do pracy z dużą liczbą plików.

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

Rozwiązałem za pomocą tych dwóch poleceń:

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

0

moja wersja odpowiedzi na pytanie:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.