Przejdź do głównej zawartości

Jak obliczyć ile miejsca zajmują wybrane pliki w danym katalogu w Linux - Bash.

Administrując systemami operacyjnymi, gdzie zainstalowane są różne aplikacje wcześniej czy później zachodzi potrzeba uporządkowania logów. Dobrze też mieć możliwość dowiedzieć się ile miejsca dane logi zajmują. Nie muszą to być tylko pliki logów ale również dowolne inne pliki i chcemy poznać ile te dane pliki w danym katalogu lub charakteryzujące się daną nazwą w sumie zajmują miejsca. Mogą to być logi z danego dnia lub też pliki o danym rozszerzeniu. Co będzie potrzebne wy zdobyć takie informacje ? Polecenie listujące pliki wraz z ich rozmiarem oraz możliwość wycięcia i zsumowania kolumny dotyczącej jedynie rozmiaru czyli np.: awk. 


Występującym tu problemem jest konwersja jednostek zastosowana w różnych narzędziach. Różnicę widać gdy stosujemy "ls" i "du". 

Krok 1 - Na potrzeby przetestowania sumowania rozmiarów plików utwórzmy testowy katalog /test a w nim 5 plików o różnych rozmiarach. 

# mkdir /tmp/test 
# cd /tmp/test

# dd if=/dev/zero of=test.data bs=1M count=1 
# dd if=/dev/zero of=test.data2 bs=5M count=1
# dd if=/dev/zero of=test.data3 bs=3M count=2
# dd if=/dev/zero of=test.data4 bs=1k count=80
# dd if=/dev/zero of=test.data5 bs=100k count=20

Krok 2 - Sprawdzenie rozmiarów plików różnymi narzędziami 

# ls -l
total 14404
-rw-r--r-- 1 root root 1048576 Oct 31 09:44 test.data
-rw-r--r-- 1 root root 5242880 Oct 31 09:44 test.data2
-rw-r--r-- 1 root root 6291456 Oct 31 09:45 test.data3
-rw-r--r-- 1 root root   81920 Oct 31 09:46 test.data4
-rw-r--r-- 1 root root 2048000 Oct 31 09:47 test.data5

# du *
1028    test.data
5132    test.data2
6156    test.data3
84      test.data4
2004    test.data5

# du -sb *
1048576 test.data
5242880 test.data2
6291456 test.data3
81920   test.data4
2048000 test.data5

Jak widać wyświetlenie rozmiaru plików w narzędziu "du" daje identyczny wynik rozmiaru plików jak polecenie "ls -l" gdy użyjemy przełącznika podającego rozmiar w bajtach "b". Istotne jest również, że przy tworzeniu tych plików podany był rozmiar bloku.  

Zliczanie sumy rozmiarów plików w danym katalogu


Sposób 1 

Suma rozmiarów plików w katalogu /tmp/test zliczona przy użyciu polecenia "du" oraz narzędzia "awk" wynik podany w Kb

# du -sb * | awk '{ print $1 }' | awk '{ c+=$1 } END {x=c/1024 ; printf "%4.2f\n", x}'

14368.00

Sposób 2 

Suma rozmiarów plików w katalogu /tmp/test zliczona przy użyciu polecenia "ll" oraz narzędzia "awk" wynik podany w Kb

# ll | awk '{ print $5 }' | awk '{ c+=$1 } END {x=c/1024 ; printf "%4.2f\n", x}'

14368.00

Powyższe polecenia mogą zostać przeliczone na MB i GB (w zależności od współczynnika c)  : 

MB

# du -sb * | awk '{ print $1 }' | awk '{ c+=$1 } END {x=c/1024/1024 ; printf "%4.2f\n", x}'
14.03

# ll | awk '{ print $5 }' | awk '{ c+=$1 } END {x=c/1024/1024 ; printf "%4.2f\n", x}'
14.03

GB

# du -sb * | awk '{ print $1 }' | awk '{ c+=$1 } END {x=c/1024/1024/1024 ; printf "%4.2f\n", x}'
0.01

# ll | awk '{ print $5 }' | awk '{ c+=$1 } END {x=c/1024/1024/1024 ; printf "%4.2f\n", x}'
0.01


Zliczanie sumy rozmiarów wybranych plików w danym katalogu


Na potrzeby tego ćwiczenia utworzymy jeszcze dwa dodatkowe pliki o innych nazwach. 

# dd if=/dev/zero of=plik.zlicz1 bs=100k count=50
# dd if=/dev/zero of=plik.zlicz2 bs=100k count=42

Obecna lista plików w katalogu /tmp/test to : 

# ll
total 23628
-rw-r--r-- 1 root root 5120000 Oct 31 10:10 plik.zlicz1
-rw-r--r-- 1 root root 4300800 Oct 31 10:11 plik.zlicz2
-rw-r--r-- 1 root root 1048576 Oct 31 09:44 test.data
-rw-r--r-- 1 root root 5242880 Oct 31 09:44 test.data2
-rw-r--r-- 1 root root 6291456 Oct 31 09:45 test.data3
-rw-r--r-- 1 root root   81920 Oct 31 09:46 test.data4
-rw-r--r-- 1 root root 2048000 Oct 31 09:47 test.data5


Chcąc zliczyć sumę rozmiarów plików plik.zlicz1 oraz plik.zlicz2 można wyodrębnić je stosując polecenie "grep". 

# du -sb *|grep plik | awk '{ print $1 }' | awk '{ c+=$1 } END {x=c/1024/1024 ; printf "%4.2f\n", x}'
8.98

# ll |grep plik | awk '{ print $5 }' | awk '{ c+=$1 } END {x=c/1024/1024 ; printf "%4.2f\n", x}'
8.98

W powyższy sposób sumowaniem objęte zostały jedynie pliki spełniające warunki określone w poleceniu "grep"

Dokładne informację dotyczące danego pliku gdzie znajduje się jego rozmiar w bajtach i blokach oraz dane dotyczące jego modyfikacji można uzyskać poleceniem "stat"

# stat test.data
  File: `test.data'
  Size: 1048576         Blocks: 2056       IO Block: 4096   regular file
Device: fd04h/64772d    Inode: 32773       Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-10-31 09:42:15.000000000 +0100
Modify: 2013-10-31 09:44:34.000000000 +0100
Change: 2013-10-31 09:44:34.000000000 +0100

Różnicę w rozmiarze można zaobserwować jeżeli wykonamy takie porównanie:

# du -sb test/
24137728        test/

# cd test/

# du -sb *| awk '{ print $1 }' | awk '{ c+=$1 } END {x=c/1024 ; printf "%4.2f\n", x}'

23568.00

Polecenie "du -sb" wykonane na katalogu /tmp/test oraz suma rozmiarów plików obliczona wewnątrz katalogu /tmp/test/ daje zbliżone ale nieco inne wyniki.


Komentarze

  1. Ciekawy artykuł, zastanawiam się tylko czemu służy liczenie wielkości wagi plików? Pojemności na serwerach?

    OdpowiedzUsuń
    Odpowiedzi
    1. Możesz się wtedy dowiedzieć o ile przyrosło danych np w katalogu gdzie przechowujesz logi by zaplanować jak duży rozmiar potrzebujesz na ich przechowywanie powiedzmy w określonym czasie np. przez miesiąc czy kwartał.

      Usuń

Prześlij komentarz

Najczęściej czytane w tym miesiącu

50 popularnych pytań dotyczących systemu Linux zadawanych na rozmowach kwalifikacyjnych. (Pytania & Odpowiedzi)

Jak dodać użytkownika w systemie Windows z poziomu konsoli CMD? (net user, net localgroup)

Generowanie testowych plików o określonej wielkości