Polecenie stat w systemie Linux dostarcza znacznie więcej informacji niż polecenie ls. Dzięki temu narzędziu możesz odkryć szczegóły, które są ukryte pod powierzchnią. W tym artykule przedstawimy, jak wykorzystać to polecenie w praktyce.
Zanurzenie w świecie stat
Polecenie ls jest niezwykle funkcjonalne i dostarcza wielu informacji, ale w systemie Linux zawsze można zagłębić się dalej. Nie ograniczaj się do powierzchownych danych; możesz zbadać system jeszcze dokładniej. Linuksa można porównać do cebuli, której kolejne warstwy odkrywasz.
Wynik polecenia ls pokazuje różne szczegóły dotyczące pliku, takie jak jego uprawnienia, rozmiar oraz to, czy jest to plik czy dowiązanie symboliczne. Informacje te są pobierane z struktury systemu plików znanej jako i-węzeł.
Każdy plik i katalog ma przypisany i-węzeł, który przechowuje metadane na temat pliku, w tym informacje o zajmowanych przez niego blokach i znacznikach dat. I-węzeł można porównać do karty bibliotecznej, ale nie ujawnia wszystkich szczegółów. Aby uzyskać pełny obraz, musimy skorzystać z polecenia stat.
Podobnie jak w przypadku ls, polecenie stat oferuje wiele opcji, co czyni je idealnym kandydatem do ustawienia aliasów. Kiedy już odkryjesz zestaw opcji, które dostarczają pożądanych wyników, możesz je spakować w alias lub funkcję powłoki, co ułatwi korzystanie z tego narzędzia bez konieczności pamiętania o skomplikowanych parametrach.
Krótka porównanie
Rozpocznijmy od ls, aby uzyskać szczegółową listę z rozmiarami plików w formacie czytelnym dla człowieka (opcja -h):
ls -lh ana.h
Informacje dostarczane przez ls obejmują:
- Pierwszy znak to „-”, co oznacza, że jest to zwykły plik, a nie gniazdo czy dowiązanie symboliczne.
- Właściciel, grupa oraz uprawnienia w formacie ósemkowym.
- Liczba twardych linków, zazwyczaj wynosząca jeden.
- Właścicielem pliku jest Dave.
- Właścicielem grupy jest Dave.
- Rozmiar pliku wynosi 802 bajty.
- Plik był ostatnio modyfikowany 13 grudnia 2015 roku.
- Nazwa pliku to ana.c.
Przyjrzyjmy się teraz wynikowi polecenia stat:
stat ana.h
Informacje uzyskane z polecenia stat to:
- Plik: nazwa pliku, zazwyczaj odpowiadająca nazwie wprowadzonej w wierszu poleceń, ale może być inna, jeśli chodzi o dowiązanie symboliczne.
- Rozmiar: rozmiar pliku w bajtach.
- Bloki: liczba bloków systemu plików potrzebnych do przechowywania pliku na dysku.
- Blok we/wy: rozmiar bloku systemu plików.
- Typ pliku: określa rodzaj obiektu w metadanych. Najczęściej występujące typy to pliki i katalogi, ale mogą to być również dowiązania, gniazda czy potoki nazwane.
- Urządzenie: identyfikator dysku twardego, na którym znajduje się plik, podany zarówno w formacie szesnastkowym, jak i dziesiętnym.
- I-węzeł: numer i-węzła, który jednoznacznie identyfikuje plik, w połączeniu z numerem urządzenia.
- Linki: liczba twardych linków prowadzących do pliku. Przy każdym tworzeniu lub usuwaniu twardego linku liczba ta się zmienia.
- Dostęp: uprawnienia dostępu do pliku w formacie ósemkowym i tradycyjnym rwx (odczyt, zapis, wykonywanie).
- Uid: identyfikator użytkownika oraz nazwa konta właściciela.
- Gid: identyfikator grupy oraz nazwa konta właściciela.
- Dostęp: znacznik czasu ostatniego dostępu. Nowoczesne dystrybucje Linuksa używają schematu zwanego relatime.
- Modyfikacja: znacznik czasu ostatniej modyfikacji zawartości pliku.
- Zmiana: znacznik czasu ostatniej zmiany atrybutów lub zawartości pliku.
- Data urodzenia: zarezerwowana dla oryginalnej daty utworzenia pliku, jednak nie zaimplementowana w systemie Linux.
Zrozumienie znaczników czasowych
Znaczniki czasowe są uzależnione od strefy czasowej. Wartość -0500 na końcu wyniku oznacza, że plik został utworzony w strefie czasowej UTC, która jest pięć godzin przed strefą czasową komputera, na którym go przeglądamy. Oznacza to, że komputer, na którym utworzono plik, znajduje się w strefie czasowej Wielkiej Brytanii, a my przeglądamy go w strefie czasowej standardu wschodniego USA.
Znaczniki czasowe modyfikacji i zmiany mogą być mylące, ponieważ ich nazwy sugerują, że oznaczają to samo.
Możemy użyć polecenia chmod, aby zmienić uprawnienia do pliku ana.c, umożliwiając wszystkim zapis. Zmiana ta nie wpłynie na zawartość pliku, lecz na jego atrybuty:
chmod +w ana.c
Następnie ponownie użyjemy stat, aby sprawdzić znaczników czasowych:
stat ana.c
Zauważ, że znacznik czasu zmiany został zaktualizowany, ale znacznik modyfikacji pozostał bez zmian.
Znacznik modyfikacji aktualizuje się tylko w przypadku zmiany zawartości pliku, podczas gdy znacznik zmiany aktualizuje się zarówno przy modyfikacji treści, jak i atrybutów.
Używanie stat dla wielu plików
Aby uzyskać raport stat dla wielu plików jednocześnie, wystarczy przekazać ich nazwy do polecenia stat:
stat ana.h ana.o
Aby użyć stat dla zestawu plików, można zastosować dopasowanie wzorców. Znak zapytania „?” reprezentuje dowolny pojedynczy znak, a gwiazdka „*” reprezentuje dowolny ciąg znaków. Możemy więc polecić statowi, aby raportował wszystkie pliki o nazwie „ana” z jednoliterowym rozszerzeniem:
stat ana.?
Zgłaszanie systemów plików przez stat
Polecenie stat może również raportować o stanie systemów plików. Opcja -f (filesystem) każe mu raportować o systemie plików, w którym znajduje się dany plik. Możemy także podać katalog, na przykład „/”, zamiast nazwy pliku.
stat -f ana.c
Otrzymujemy następujące informacje:
- Plik: nazwa pliku.
- ID: identyfikator systemu plików w notacji szesnastkowej.
- Namelen: maksymalna dopuszczalna długość nazw plików.
- Typ: typ systemu plików.
- Rozmiar bloku: ilość danych do żądania odczytu dla optymalnej szybkości transferu.
- Podstawowy rozmiar bloku: rozmiar każdego bloku w systemie plików.
Bloki:
- Łącznie: całkowita liczba bloków w systemie plików.
- Wolny: liczba dostępnych bloków w systemie plików.
- Dostępne: liczba wolnych bloków dostępnych dla zwykłych użytkowników (nie dla root).
I-węzły:
- Razem: całkowita liczba i-węzłów w systemie plików.
- Wolny: liczba dostępnych i-węzłów w systemie plików.
Obsługa dowiązań symbolicznych
Jeśli używasz stat dla pliku, który jest dowiązaniem symbolicznym, wynik pokaże link. Aby sprawdzić plik, do którego prowadzi dowiązanie, użyj opcji -L (dereference). Plik code.c jest dowiązaniem symbolicznym do ana.c. Spójrzmy, co się stanie, gdy użyjemy polecenia bez opcji -L:
stat code.c
Wynik pokazuje, że code.c wskazuje na (->) ana.c. Rozmiar pliku wynosi tylko 11 bajtów, a typ pliku to dowiązanie symboliczne.
Teraz spróbujmy to samo z opcją -L:
stat -L code.c
Teraz widzimy szczegóły pliku, na który wskazuje dowiązanie. Należy jednak pamiętać, że nazwa pliku jest nadal podana jako code.c, ponieważ to jest nazwa linku, a nie pliku docelowego.
Krótkie podsumowanie
Opcja -t (terse) sprawia, że stat wyświetla zwięzłe podsumowanie:
stat -t ana.c
Wynik nie zawiera żadnych wskazówek. Aby zrozumieć tę informację, musisz odnosić się do pełnego wyniku statystycznego.
Niestandardowe formaty wyjściowe
Aby uzyskać inny zestaw danych z polecenia stat, możesz skorzystać z formatu niestandardowego. Istnieje wiele tokenów, zwanych sekwencjami formatu, które reprezentują różne elementy danych. Wybierz te, które chcesz uwzględnić w wynikach, a następnie utwórz odpowiedni ciąg formatu. Przekazując ten ciąg do stat, otrzymasz tylko żądane elementy danych.
Oto lista dostępnych sekwencji formatów dla plików:
- % a: Uprawnienia w formacie ósemkowym.
- % A: Uprawnienia w formacie czytelnym dla człowieka (rwx).
- % b: liczba przydzielonych bloków.
- % B: rozmiar w bajtach każdego bloku.
- % d: numer urządzenia w formacie dziesiętnym.
- % D: numer urządzenia w formacie szesnastkowym.
- % f: tryb surowy w hex.
- % F: Typ pliku.
- % g: identyfikator grupy właściciela.
- % G: nazwa grupy właściciela.
- % h: liczba twardych linków.
- % i: numer i-węzła.
- % m: punkt montowania.
- % n: nazwa pliku.
- % N: nazwa pliku w cudzysłowie z wyodrębnioną nazwą pliku w przypadku dowiązania symbolicznego.
- % o: wskazówka dotycząca optymalnego rozmiaru transferu we/wy.
- % s: całkowity rozmiar w bajtach.
- % t: główny typ urządzenia zapisany szesnastkowo dla specjalnych plików znakowych/blokowych.
- % T: podrzędny typ urządzenia zapisany szesnastkowo dla specjalnych plików znakowych/blokowych.
- % u: identyfikator użytkownika właściciela.
- % U: nazwa użytkownika będącego właścicielem.
- % w: czas powstania pliku w formie czytelnej dla człowieka lub łącznik „-”, jeśli nieznany.
- % W: czas narodzin pliku w sekundach od epoki; 0 jeśli nieznany.
- % x: czas ostatniego dostępu w formie czytelnej dla człowieka.
- % X: czas ostatniego dostępu w sekundach od epoki.
- % y: czas ostatniej modyfikacji danych w formie czytelnej dla człowieka.
- % Y: czas ostatniej modyfikacji danych w sekundach od epoki.
- % z: czas ostatniej zmiany statusu w formie czytelnej dla człowieka.
- % Z: czas ostatniej zmiany statusu w sekundach od epoki.
„Epoka” odnosi się do Unix Epoch, która miała miejsce 1 stycznia 1970 roku o godzinie 00:00:00 UTC.
Dla systemów plików dostępne są następujące sekwencje formatów:
- % a: liczba wolnych bloków dostępnych dla zwykłych użytkowników (innych niż root).
- % b: całkowita liczba bloków danych w systemie plików.
- % c: całkowita liczba i-węzłów w systemie plików.
- % d: liczba wolnych i-węzłów w systemie plików.
- % f: liczba wolnych bloków w systemie plików.
- % i: identyfikator systemu plików w formacie szesnastkowym.
- % l: maksymalna długość nazw plików.
- % n: nazwa pliku.
- % s: rozmiar bloku (optymalny rozmiar zapisu).
- % S: rozmiar bloków systemu plików (dla liczby bloków).
- % t: typ systemu plików w formacie szesnastkowym.
- % T: typ systemu plików w formie czytelnej dla człowieka.
Opcje, które akceptują ciągi sekwencji formatów, to –format i –printf. Różnica polega na tym, że –printf interpretuje sekwencje ucieczki w stylu C, takie jak nowa linia n oraz tabulator t, i nie dodaje automatycznie znaku nowej linii do swojego wyjścia.
Utwórzmy ciąg formatu i przekażmy go do stat. Wykorzystamy sekwencje formatów: %n jako nazwę pliku, %s jako jego rozmiar oraz %F jako typ pliku. Dodamy sekwencję ucieczki n na końcu, aby każdy plik był wyświetlany w nowej linii. Nasz ciąg formatu będzie wyglądał następująco:
"File %n is %s bytes, and is a %Fn"
Przekażemy to do stat za pomocą opcji –printf, raportując plik o nazwie code.c oraz zestaw plików pasujących do ana.?. Oto pełne polecenie, pamiętaj o znaku równości „=” między –printf a ciągiem formatu:
stat --printf="File %n is %s bytes, and is a %Fn" code.c ana/ana.?
Wynik zawiera raport dla każdego pliku w nowej linii, pokazując jego nazwę, rozmiar i typ.
Użycie niestandardowych formatów umożliwia uzyskanie jeszcze większej liczby danych, niż jest to dostępne w standardowym wyjściu.
Precyzyjna kontrola
Jak widać, narzędzie to daje ogromne możliwości wyodrębnienia konkretnych informacji, które mogą być dla Ciebie istotne. To również wyjaśnia, dlaczego zaleca się korzystanie z aliasów dla bardziej złożonych poleceń.
newsblog.pl
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.