Jak korzystać z polecenia stat w systemie Linux

Polecenie stat w systemie Linux pokazuje znacznie więcej szczegółów niż robi to ls. Zajrzyj za kurtynę dzięki temu informacyjnemu i konfigurowalnemu narzędziu. Pokażemy Ci, jak z niego korzystać.

stat zabiera Cię za kulisy

Polecenie ls świetnie sobie radzi z tym, co robi – i robi bardzo dużo – ale w przypadku Linuksa wydaje się, że zawsze istnieje sposób, aby wejść głębiej i zobaczyć, co kryje się pod powierzchnią. Często nie chodzi tylko o podniesienie krawędzi dywanu. Możesz podrzeć deski podłogowe, a następnie wykopać dziurę. Możesz obrać Linuksa jak cebulę.

ls pokaże Ci wiele informacji o pliku, takich jak nadane mu uprawnienia, jego wielkość i czy jest to plik czy dowiązanie symboliczne. Aby wyświetlić te informacje, czyta je z pliku struktura systemu plików zwana i-węzłem.

Każdy plik i katalog ma i-węzeł. I-węzeł trzyma metadane dotyczące pliku, takie jak zajmowane przez niego bloki systemu plików i znaczniki daty powiązane z plikiem. I-węzeł jest jak karta biblioteczna dla pliku. Ale pokaże ci tylko niektóre informacje. Aby zobaczyć wszystko, musimy użyć polecenia stat.

Podobnie jak ls, polecenie stat ma wiele opcji. To czyni go doskonałym kandydatem do używania aliasów. Po odkryciu określonego zestawu opcji, które sprawiają, że stat daje pożądane wyniki, opakuj je w alias lub funkcję powłoki. To sprawia, że ​​jest znacznie wygodniejszy w użyciu i nie musisz pamiętać tajemniczego zestawu opcji wiersza poleceń.

Szybkie porównanie

Użyjmy ls, aby dać nam długą listę (opcja -l) z rozmiarami plików czytelnymi dla człowieka (opcja -h):

ls -lh ana.h

ls -lh ana.h w oknie terminala

Od lewej do prawej informacje, które dostarcza ls to:

Pierwszy znak to myślnik „-”, co oznacza, że ​​plik jest zwykłym plikiem, a nie gniazdem, dowiązaniem symbolicznym czy innym typem obiektu.
Właściciel, grupa i inne uprawnienia są wymienione w formacie ósemkowym.
Liczba twardych linków kierujących do tego pliku. W tym przypadku w większości przypadków będzie to jeden.
Właścicielem pliku jest Dave.
Właścicielem grupy jest Dave.
Rozmiar pliku to 802 bajty.
Plik był ostatnio modyfikowany w piątek 13 grudnia 2015 r.
Nazwa pliku to ana.c.

Rzućmy okiem na statystykę:

stat ana.h

stat ana.h w oknie terminala

Informacje, które otrzymujemy ze statystyk, to:

Plik: nazwa pliku. Zwykle jest taka sama, jak nazwa, którą przekazaliśmy do stat w wierszu poleceń, ale może być inna, jeśli patrzymy na dowiązanie symboliczne.
Rozmiar: rozmiar pliku w bajtach.
Bloki: liczba bloków systemu plików wymaganych przez plik, aby mógł być przechowywany na dysku twardym.
Blok we / wy: rozmiar bloku systemu plików.
Typ pliku: typ obiektu opisywanego w metadanych. Najpopularniejszymi typami są pliki i katalogi, ale mogą to być również łącza, gniazda lub potoki nazwane.
Urządzenie: numer urządzenia w szesnastkowy i dziesiętnie. To jest identyfikator dysku twardego, na którym przechowywany jest plik.
I-węzeł: numer i-węzła. To znaczy numer identyfikacyjny tego i-węzła. Razem numer i-węzła i numer urządzenia jednoznacznie identyfikują plik.
Linki: ta liczba wskazuje, ile twardych linków prowadzi do tego pliku. Każde łącze twarde ma swój własny i-węzeł. Innym sposobem myślenia o tej liczbie jest to, ile i-węzłów wskazuje na ten jeden plik. Za każdym razem, gdy jest tworzony lub usuwany twardy link, liczba ta zostanie zwiększona lub zmniejszona. Kiedy osiągnie zero, sam plik został usunięty, a i-węzeł jest usuwany. Jeśli używasz stat w katalogu, liczba ta reprezentuje liczbę plików w katalogu, w tym „.” wpis dla katalogu bieżącego i wpis „..” dla katalogu nadrzędnego.
Dostęp: Prawa dostępu do plików są wyświetlane w formacie ósemkowym i tradycyjnym rwx (odczyt, zapis, wykonywanie).
Uid: identyfikator użytkownika i nazwa konta właściciela.
Gid: identyfikator grupy i nazwa konta właściciela.
Dostęp: sygnatura czasowa dostępu. Nie tak proste, jak mogłoby się wydawać. Nowoczesne dystrybucje Linuksa używają schematu zwanego relatime, który próbuje zoptymalizować zapisy na dysku twardym wymagane do aktualizacji czasu dostępu. Mówiąc najprościej, czas dostępu jest aktualizowany, jeśli jest starszy niż zmodyfikowany czas.
Modyfikuj: sygnatura czasowa modyfikacji. Jest to czas ostatniej modyfikacji zawartości pliku. (Na szczęście zawartość tego pliku była ostatnio zmieniana cztery lata temu.)
Zmiana: sygnatura czasowa zmiany. Jest to czas ostatniej zmiany atrybutów lub zawartości pliku. Jeśli zmodyfikujesz plik, ustawiając nowe uprawnienia do pliku, znacznik czasu zmiany zostanie zaktualizowany (ponieważ zmieniły się atrybuty pliku), ale zmodyfikowany znacznik czasu nie zostanie zaktualizowany (ponieważ zawartość pliku nie została zmieniona).
Data urodzenia: Zarezerwowane, aby pokazać oryginalną datę utworzenia pliku, ale nie jest to zaimplementowane w systemie Linux.

Zrozumienie sygnatur czasowych

Sygnatury czasowe zależą od strefy czasowej. Wartość -0500 na końcu każdego wiersza wskazuje, że ten plik został utworzony na komputerze w formacie Skoordynowany czas uniwersalny (UTC) strefa czasowa, która jest pięć godzin przed strefą czasową bieżącego komputera. Więc ten komputer jest pięć godzin za komputerem, który utworzył ten plik. W rzeczywistości plik został utworzony na komputerze ze strefą czasową w Wielkiej Brytanii i patrzymy na niego tutaj na komputerze w strefie czasowej standardu wschodniego USA.

Modyfikacja i zmiana znaczników czasu mogą powodować zamieszanie, ponieważ dla niewtajemniczonych ich nazwy brzmią tak, jakby oznaczały to samo.

Użyjmy chmod, aby zmodyfikować uprawnienia do pliku o nazwie ana.c. Zamierzamy umożliwić wszystkim zapisywanie. Nie wpłynie to na zawartość pliku, ale wpłynie na atrybuty pliku.

chmod +w ana.c

Następnie użyjemy statystyk, aby spojrzeć na sygnatury czasowe:

stat ana.c

chnod + w ana.c w oknie terminala

Znacznik czasu zmiany został zaktualizowany, ale zmodyfikowany nie.

Zmodyfikowany znacznik czasu zostanie zaktualizowany tylko wtedy, gdy zmieni się zawartość pliku. Sygnatura czasowa zmiany jest aktualizowana zarówno w przypadku zmian treści, jak i zmian atrybutów.

Używanie Stat z wieloma plikami

Aby mieć raport o statystykach kilku plików naraz, przekaż nazwy plików do stat w wierszu poleceń:

stat ana.h ana.o

stat ana.h ana.o w oknie terminala

Aby użyć statystyki na zestawie plików, użyj dopasowania wzorców. Znak zapytania „?” reprezentuje dowolny pojedynczy znak, a gwiazdka „*” reprezentuje dowolny ciąg znaków. Możemy nakazać statowi raportować o każdym pliku o nazwie „ana” z rozszerzeniem jednoliterowym za pomocą tego polecenia:

stat ana.?

stat ana.?  w oknie terminala

Używanie statystyki do raportowania o systemach plików

stat może raportować o stanie systemów plików, a także o stanie plików. Opcja -f (system plików) mówi statowi, aby raportował o systemie plików, na którym znajduje się plik. Zauważ, że możemy również przekazać katalog taki jak „/” do stat zamiast nazwy pliku.

stat -f ana.c

stat -f ana.c w oknie terminala

Statystyki, które nam daje to:

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 w celu uzyskania optymalnych szybkości przesyłania danych.
Podstawowy rozmiar bloku: rozmiar każdego bloku systemu plików.

Bloki:

Łącznie: całkowita liczba wszystkich bloków w systemie plików.
Wolny: liczba wolnych bloków w systemie plików.
Dostępne: liczba wolnych bloków dostępnych dla zwykłych użytkowników (innych niż root).

I-węzły:

Razem: całkowita liczba i-węzłów w systemie plików.
Wolny: liczba wolnych i-węzłów w systemie plików.

Usuwanie odwołań symbolicznych

Jeśli użyjesz statystyki dla pliku, który w rzeczywistości jest dowiązaniem symbolicznym, wyświetli on łącze. Jeśli chcesz, aby stat raportował o pliku, na który wskazuje łącze, użyj opcji -L (dereference). Plik code.c jest dowiązaniem symbolicznym do ana.c. Spójrzmy na to bez opcji -L:

stat code.c

stat code.c w oknie terminala

Nazwa pliku pokazuje code.c wskazujący na (->) ana.c. Rozmiar pliku to tylko 11 bajtów. Nie ma żadnych bloków przeznaczonych na przechowywanie tego linku. Typ pliku jest wymieniony jako dowiązanie symboliczne.

Najwyraźniej nie patrzymy tutaj na rzeczywisty plik. Zróbmy to jeszcze raz i dodajmy opcję -L:

stat -L code.c

stat -L code.c w oknie terminala

To teraz pokazuje szczegóły pliku wskazanego przez dowiązanie symboliczne. Należy jednak pamiętać, że nazwa pliku jest nadal podawana jako kod. C. To jest nazwa łącza, a nie plik docelowy. Dzieje się tak, ponieważ jest to nazwa, którą przekazaliśmy statowi w wierszu poleceń.

Zwięzły raport

Opcja -t (terse) powoduje, że stat wyświetla skondensowane podsumowanie:

stat -t ana.c

stat -t ana.c w oknie terminala

Nie ma żadnych wskazówek. Aby to zrozumieć – dopóki nie zapamiętasz sekwencji pól – musisz odnieść to wyjście do pełnego wyniku statystycznego.

Niestandardowe formaty wyjściowe

Lepszym sposobem uzyskania innego zestawu danych ze statystyk jest użycie formatu niestandardowego. Istnieje długa lista tokenów zwanych sekwencjami formatu. Każdy z nich reprezentuje element danych. Wybierz te, które chcesz uwzględnić w danych wyjściowych i utwórz ciąg formatu. Kiedy wywołujemy stat i przekazujemy do niego ciąg formatu, dane wyjściowe będą zawierać tylko żądane elementy danych.

Istnieją różne zestawy sekwencji formatów plików i systemów plików. Lista plików to:

% a: Prawa dostępu ósemkowo.
% A: Prawa dostępu w postaci czytelnej dla człowieka (rwx).
% b: liczba przydzielonych bloków.
% B: rozmiar w bajtach każdego bloku.
% d: numer urządzenia w postaci dziesiętnej.
% 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, jeśli jest to dowiązanie symboliczne.
% 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ąca właścicielem.
% w: czas powstania pliku, czytelny dla człowieka lub łącznik „-”, jeśli nie jest znany.
% W: czas narodzin pliku, sekundy od epoki; 0 jeśli nieznany.
% x: czas ostatniego dostępu, czytelny dla człowieka.
% X: czas ostatniego dostępu, sekundy od epoki.
% y: czas ostatniej modyfikacji danych, czytelny dla człowieka.
% Y: czas ostatniej modyfikacji danych, sekundy od epoki.
% z: czas ostatniej zmiany statusu, czytelny dla człowieka.
% Z: czas ostatniej zmiany statusu, sekundy od epoki.

„Epoka” to Unix Epoch, które miało miejsce w dniu 1970-01-01 00:00:00 +0000 (UTC).

Dla systemów plików sekwencje formatów są następujące:

% 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 postaci czytelnej dla człowieka.

Istnieją dwie opcje, które akceptują ciągi sekwencji formatów. Są to –format i –printf. Różnica między nimi polega na tym, że –printf interpretuje Sekwencje ucieczki w stylu C. takie jak nowa linia n i tabulator t, i nie dodaje automatycznie znaku nowej linii do swojego wyjścia.

Utwórzmy ciąg formatu i przekażmy go do stat. Sekwencje formatów, które będą używane, to% n jako nazwa pliku,% s jako rozmiar pliku i% F jako typ pliku. Dodamy sekwencję ucieczki n na końcu łańcucha, aby upewnić się, że każdy plik jest obsługiwany w nowej linii. Nasz ciąg formatu wygląda następująco:

"File %n is %s bytes, and is a %Fn"

Przekażemy to do statystyki za pomocą opcji –printf. Poprosimy statysty o raportowanie pliku o nazwie code.c oraz zestawu plików, które pasują do ana.?. To jest pełne polecenie. Zwróć uwagę na znak 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.?

stat --printf =

Raport dla każdego pliku jest wymieniony w nowej linii, o co prosiliśmy. Podano nam nazwę, rozmiar i typ pliku.

Formaty niestandardowe zapewniają dostęp do jeszcze większej liczby elementów danych, niż są zawarte w standardowych danych wyjściowych.

Precyzyjna kontrola ziarna

Jak widać, istnieje ogromne możliwości wyodrębnienia poszczególnych elementów danych, które Cię interesują. Prawdopodobnie możesz również zobaczyć, dlaczego zalecamy używanie aliasów do dłuższych i bardziej złożonych zaklęć.