Tym wpisem chciałbym rozpocząć ciąg, krótkich artykułów o tym co można stworzyć używając skryptów. W większości będą to skrypty napisane w bashu lub w pythonie. Zacznę od przeróbki ciekawego jednowierszowego skryptu znalezionego w książce Serwer linuksowy okiem hakera autorstwa Roba Fkickengera.
Umożliwia on znalezienie „pożeracza dysku” znaczy folderu (folderów) zajmujących najwięcej miejsca na dysku. Oto i on:
alias ducks='du -cks * | sort -rn | head -15'
Wyświetla on dwie kolumny – jedną z wielkością pliku, a drugą z nawą.
Patrząc po kolei na składowe skryptu :
- alias – umożliwia zastąpienie wyrazu ducks komendą znajdującą się w apostrofach
- du – określa ilość miejsca zajmowanego przez plik, opcje -cks nakazują: c – wyświetlenie podsumowania (pozycja razem); k – wyświetlenie wielkości pliku w kilobajtach; s – wyświetlenie wielkości tylko tych elementów, których nazwy podaliśmy jako argumenty; znak * powoduje określenie wielkości wszystkich plików w katalogu
- sort – jak nazwa wskazuje sortuje strumień, opcje n powoduje że program traktuję pierwszą kolumnę jako liczbę (znaczy 98 będzie przed 111), opcja r powoduje posortowanie w odwrotnej kolejności
- head – wypisuje pierwszych 15 linii (dzięki opcji -15) strumienia
Należy wspomnieć o roli |, jest to tak zwany potok (pipe), który umożliwia przekazywanie (prawie) wszystkiego co wyświetlił jeden program do drugiego. Jedynie błędy nie będą przekierowany ponieważ są wyświetlane na standardowym strumieniu błędów. Dzięki połączeniu potokowemu wszystko co ‘wypluje z siebie’ du przekazywane jest do polecenia sort, które sortuje je, a następnie polecenie head przycina tą listę i wyświetla pierwsze 15 linii. Jeśli chciałbyś (chciałabyś) dowiedzieć się więcej na temat standardowych strumieni to polecam Ci standardowe strumienie.
Teraz polecenie ducks przedstawi nam 14 największych plików w danym katalogu. Jednak ten sposób prezentowania danych jest dość męczący. O ile jeszcze widząc plik o wielkości 1246 można łatwo zgadnąć, że ma 1,2 MB, to już z 98173 jest znacznie trudniej. Można oczywiście ustawić opcję -m programu du zamiast -k. Spowoduje to wyświetlenie wyników w megabajtach. Jednakże nie jest to dobry pomysł ponieważ duże foldery ( kilka lub kilkadziesiąt gigabajtów) będą wyświetlone nieczytelnie, a większość małych plików będzie zaokrąglona do 1 M (np. plik o rozmiarze 400K) . Można także użyć -h. Polecenie wyświetli wtedy rozmiar pliku w formacie czytelnym dla ludzi (znaczy zamiast 1024 będzie 1M), lecz uniemożliwia to użycie polecenia sort.
Pomyślałem, że dobrym rozwiązaniem tego problemu jest stworzenie programu który będzie znajdował się na końcu ‘łańcuszka’ poleceń i zmieniał wszystkie wielkość na ich czytelne wersje. Oczywiście wszystko zaimplementowałem w pythonie. Oto kod programu:
#!/usr/bin/env python import sys prefix=['k', 'M', 'G', 'T'] text = sys.stdin.readline() while text != '': x=text.split('\t') n=int(x[0]) i=0 while n > 1024/2: n=round(n/10.24)/100 i+=1 x[0]=str(n) sys.stdout.write("%s" % (x[0]+prefix[i]+"\t"+x[1])) text = sys.stdin.readline()
Aby użyć skrypt należy zapisać go w jakimś pliku (odkrywcze, prawda ??) np. mb.py. Dodać prawo uruchamiania pliku
chmod +x mb.pyNastępnie można używać w ten sposób :
alias ducks='du -cks * | sort -rn | head -15|~/mb.py'
Zakładając, że plik znajduje się w katalogu ~ (home) użytkownika.
Sam skrypt nie jest zbyt skomplikowany. Jest parę miejsc, które chciałbym omówić:
text = sys.stdin.readline()
wczytuje jedną linie ze standardowego wejścia
x=text.split('\t')
rozkłada linijkę na dwie części, używając jako separatora znaku tabulatora
n=round(n/10.24)/100
umożliwia zaokrąglenie wyniku do dwóch miejsc po przecinku
Podsumowują udało nam się stworzyć narzędzie konsolowe umożliwiające określenie wielkości plików i katalogów w bieżącym katalogu. Wyświetla ono dane w przystępnym formacie. Co prawda istnieją inne programy spełniające podobne funkcje np. gnomowy Analizator wykorzystania dysku, jednak uważam, że warto znać alternatywę (np. do użycia na serwerze, gdzie nie mamy dostępu do X-ów).
Stron:



