Skip to content


Suma Pojemność Plików w Folderze

Administrator Bazy Danych Oracle ma problemy. Rozmiary pokazane użycia folderów pokazane przez AIX nie mają takich samych wartości jak pokazuję to jego narzędzia oparte na środowisku Windows. Coś tutaj nie gra….. On podejrzewa, że du ma błąd a podawame przez niego wyniki nie są prawdziwe – “to jest AIX 6.1, to musi być jakiś ‘owad’! Ja proponuję dodanie rozmiaru każdego pliku we wskazanych przez niego folderach i porównania rezultatów z wynikami otrzymanymi przez du -sk *. Jeżeli te wyniki są bardzo podobne do siebie to oznacza, że du pracuje poprawnie. Dlaczego podobne, a nie identyczne? Ja będę dodawał tylko zwykłe pliki, a nie napotkane po drodze foldery, czy subfoldery….


Poniżej jest kod (skrypt, który ja nazwałem addmeup.ksh) wykonujące pożądane przez nas czynności:


#!/usr/bin/ksh
#
# execution example: ./addmeup.ksh /path/to/somewhere
cd $1
TotalSizeKB=0
for file in `find . -type f`
do
sizeInKB=`ls -s $file | awk '{print $1}'`
((TotalSizeKB = TotalSizeKB + sizeInKB))
done
echo "$TotalSizeKB 'KB'"

Co tutaj się dzieje? Pierwsza linika określa jaki tłumacz poleceń (shell) należy użyć do “trawienia” reszty zawartości tego pliku. W naszym przypadku będzie to Korn. Linia zawierająca cd $1 bierze argument tego skryptu i używa go jako cel polecenia cd – zmieniamy położenie do foldera określonego przez zmienną $1. Następna linijka deklaruje zmienną size i przyznaje jej początkową wartość równą 0. Kolejna linijka określa początek pętli typu for. Ta linia powinna być czytana ze prawej strony w lewo – do początku. Zdając sobie z tego sprawę czytamy, że w obecnym (.) folderze szukamy zwyczajnych plików (`find . -type f`), nie folderów, sub-folderów, . lub ... Nazwa każdego pliku znalezionego przez polecenie find jest przechowywana w zmiennej file – ale mam bujną wyobraźnię, prawda?
Kolejna linijka kodu określa początek zawartości naszej pętli. Przestrzeń pomiędzy do oraz done jest miejscem gdzie odbywają się nasze akcje czyli kalkulacje. Pierwsza linijka akcji, wydaje polecenie ls -s przeciwko każdemu plikowi, którego nazwa jest zawarta w zmiennej file. Następnie, w dalszym ciągu na tej samej linii kod awk ‘{print $1}’ wyciąga wartość w pierwszej kolumnie produktu wyświetlonego przez ls -s $file. Ta wartość to rozmiar pliku wyrażony w jednostkach KB, która jest przechowywana w zmiennej SizeInKB.


Na następnej linijce, operacja dodawania zwiększa wartość zmiennej SizeInKB o wartość zawartą w SizeInKB. Kod done oznacza koniec pętli oraz powoduje powtórzenie tego procesu od początku – od linijki zawierającej for file ...... Dodawanie jest kumulacyjne, wielkość każdego znalezionego pliku jest dodana do wartości zmiennej przechowującej wielkość całkowitą wszystkich plików. Po znalezieniu wszystkich plików, pierwsza linia pętli (linia zawierająca for) nie jest w stanie przyznać nowej wartości zmiennej file co sygnalizuje zakończenie egzekucji pętli.

Następnie, wydane zostaje polecenie wyświetlające wartość przechowana w TotalSizeInKB i następujący po tym skrót KB. A teraz, spójrzmy jak to pracuje.

MarcoPolo:/u40/oradata> du -sk *
260252352 CLTYcmn8
527459228 CLTYcmn8_adi
527459228 CLTYftr8
263282568 CLTYtst
MarcoPolo:/u40/oradata>
laorrdu001:/u40/oradata> ./addmeup.ksh CLTYcmn8
260252340 KB
MarcoPolo:/u40/oradata> ./addmeup.ksh CLTYcmn8_adi
527459212 KB
MarcoPolo:/u40/oradata> ./addmeup.ksh CLTYftr8
527459208 KB
MarcoPolo:/u40/oradata> addmeup.ksh CLTYtst7
263282552 KB
MarcoPolo:/u40/oradata>



W taki sposób polecene du zostało rozgrzeszone, a Oracle DBA musi martwić się o jedną rzecz mniej.




Zapoznaj się z komentarzem Jeffa. On pokazuje inny sposób liczenia zawartości plików systemu. Pozwoili ci to także zapoznać się z bardziej zaawansowanym użyciem tego języka.

Posted in AIX, scripts.

Tagged with , , , , , , , , , .


3 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Jeff says

    handy little script, to save some time you can basically accomplish everything in two commands:

    this returns results on large directories much faster than individual ls’s of every file.
    find . -xdev -type f -ls|awk ‘{size+=$2} END {print size” KB”}’

    to upconvert your output to GB for du -sg:
    find . -xdev -type f -ls | awk ‘
    {size += $7} END {printf(“%5.2f GB\n”,size/1024/1024/1024)}’

    i added the xdev in there for my own safety sake.

    however, while its much faster the results are even a bit more skewed from du.. i wonder why? ah well.

  2. MarekD:-) says

    Jeff,

    yes, you are 100% as -ls is a stripped down version of ls internal to the find – I just checked with the man page.
    By the way, do you awk often? What you show is very elegant.

    Thanks for your comment and all the best!!!

    MarekD:-)

  3. Jeff says

    I wouldn’t say I awk often, I mean I do awk quite a bit but i’m a little limited in my awk skills, I use it extensively for one liners and such but writing larger, more complex tasks I’ll usually revert back to shell or perl.

    btw, I greatly enjoy your blog.. have a good one



Some HTML is OK

or, reply to this post via trackback.

WordPress Anti Spam by WP-SpamShield



Copyright © 2015 - 2016 Waldemar Mark Duszyk. - best viewed with your eyes.. Created by Blog Copyright.