Jak používat příkaz stat v systému Linux

Photo of author

By etechblogcz

Příkaz stat v Linuxu poskytuje daleko obsáhlejší informace než příkaz ls. S tímto nástrojem, který je jak informativní, tak přizpůsobitelný, se můžete podívat do hloubky systému. Ukážeme si, jak ho efektivně využívat.

Hlubší pohled pomocí příkazu stat

Příkaz ls je skvělý pro svou primární funkci, a tou je poskytování základního přehledu o souborech a adresářích. Nicméně Linux nabízí možnosti, jak proniknout hlouběji a zjistit, co se skrývá „pod kapotou“. Nejedná se jen o povrchní „odhrnutí koberce“, ale o skutečné odhalení struktury systému, jako když loupete cibuli.

ls vám zobrazí základní informace, jako jsou oprávnění, velikost souboru, nebo zda se jedná o soubor či symbolický odkaz. Tyto informace ls čerpá ze struktury souborového systému zvané inode.

Každý soubor a adresář má svůj inode, který obsahuje metadata, například informace o umístění souboru v blocích, a časové údaje. Inode je tedy jako záznam v knihovně, který popisuje soubor. Ale abychom viděli vše, co systém „ví“, potřebujeme příkaz stat.

Stejně jako ls má i stat mnoho voleb. To z něj činí ideálního kandidáta pro tvorbu aliasů. Když si nadefinujete konkrétní kombinaci voleb, která vám s stat poskytne potřebný výstup, můžete si ji uložit jako alias, nebo funkci shellu pro pohodlnější a rychlejší používání.

Srovnání základních informací

Podívejme se na výstup ls s volbami pro dlouhý výpis (-l) a velikostí čitelnou pro člověka (-h) pro soubor ana.h:

ls -lh ana.h

Informace, které dostaneme, jsou následující (zleva doprava):

  • První znak, pomlčka (-), signalizuje, že jde o běžný soubor a ne o speciální typ objektu.
  • Následují oprávnění pro vlastníka, skupinu a ostatní uživatele, vyjádřená v osmičkovém formátu.
  • Třetí údaj je počet pevných odkazů, které směřují k souboru, většinou je to 1.
  • Další dvě položky jsou jméno vlastníka souboru (dave) a jméno skupiny vlastníka (také dave).
  • Následuje velikost souboru v bajtech (802).
  • Potom vidíme datum a čas poslední úpravy souboru (pátek 13. prosince 2015).
  • A nakonec samotný název souboru (ana.h).

Nyní si zobrazme stejné informace pomocí příkazu stat:

stat ana.h

Informace získané z stat jsou:

  • Soubor: Název souboru. Většinou je stejný, jaký jsme zadali v příkazovém řádku, ale může se lišit při práci se symbolickými odkazy.
  • Velikost: Velikost souboru v bajtech.
  • Bloky: Počet bloků souborového systému, které soubor zabírá na pevném disku.
  • IO blok: Velikost bloku souborového systému.
  • Typ souboru: Typ objektu. Nejčastěji soubor nebo adresář, ale může to být i odkaz, socket nebo pojmenovaná roura.
  • Zařízení: Číslo zařízení v hexadecimálním a desítkovém formátu. Jedná se o ID pevného disku, kde je soubor uložen.
  • Inode: Číslo inodu, unikátní identifikátor souboru společně s číslem zařízení.
  • Odkazy: Počet pevných odkazů na soubor. Lze také říci, kolik inodů ukazuje na daný soubor. Toto číslo se mění při vytváření nebo mazání pevných odkazů. Když dosáhne nuly, soubor je smazán. U adresáře toto číslo udává počet souborů v adresáři (včetně záznamů . a ..).
  • Přístup: Oprávnění k souboru v osmičkovém a tradičním rwx formátu.
  • Uid: ID uživatele a jméno vlastníka souboru.
  • Gid: ID skupiny a jméno skupiny vlastníka.
  • Přístup: Časové razítko posledního přístupu k souboru. Moderní distribuce Linuxu používají schéma relatime, které se snaží optimalizovat zápisy na disk při aktualizaci času přístupu. Zjednodušeně řečeno, čas přístupu se aktualizuje, pokud je starší než čas změny.
  • Upraveno: Časové razítko poslední změny obsahu souboru.
  • Změna: Časové razítko poslední změny obsahu nebo atributů souboru. Pokud například změníte oprávnění souboru, aktualizuje se čas změny, ale ne čas úpravy.
  • Narození: Vyhrazeno pro původní datum vytvoření souboru, ale v Linuxu není implementováno.

Časová razítka – co znamenají?

Časová razítka jsou ovlivněna časovými pásmy. -0500 na konci každého časového údaje naznačuje, že soubor byl vytvořen na počítači v časovém pásmu Koordinovaný světový čas (UTC), tedy 5 hodin před aktuálním počítačem. Zjednodušeně, soubor byl vytvořen na počítači s časovým pásmem Spojeného království, a nyní se na něj díváme z počítače v časovém pásmu východního standardu USA.

Časová razítka „úpravy“ a „změny“ mohou být matoucí, protože se na první pohled zdají mít stejný význam.

Použijme příkaz chmod pro změnu oprávnění souboru ana.c. Změníme ho tak, aby do něj mohl zapisovat každý. Obsah souboru se nezmění, ale změní se jeho atributy:

chmod +w ana.c

Poté si prohlédneme časová razítka:

stat ana.c

Vidíme, že časové razítko „změna“ se aktualizovalo, ale razítko „upraveno“ nikoliv.

Razítko „upraveno“ se aktualizuje pouze při změně obsahu souboru. Razítko „změna“ se aktualizuje při změně obsahu i atributů souboru.

Stat pro více souborů

Pro zobrazení statistik pro více souborů současně, zadejte názvy souborů za sebou:

stat ana.h ana.o

Pro práci s celou sadou souborů můžeme použít vzory. Otazník (?) nahrazuje jeden libovolný znak a hvězdička (*) libovolný řetězec znaků. Například, pro zobrazení statistik souborů s názvem „ana“ a příponou o délce jednoho znaku:

stat ana.?

Stat pro souborové systémy

stat dokáže zobrazovat informace nejen o souborech, ale i o souborových systémech. Použijte volbu -f (file system) a jako argument předáte soubor nebo adresář, který se v daném systému nachází (např. /).

stat -f ana.c

Informace získané o souborovém systému jsou:

  • Soubor: Název souboru.
  • ID: ID souborového systému v hexadecimálním zápisu.
  • Namelen: Maximální délka názvů souborů.
  • Typ: Typ souborového systému.
  • Velikost bloku: Množství dat pro optimální rychlost přenosu dat.
  • Základní velikost bloku: Velikost jednoho bloku.

Bloky:

  • Celkem: Celkový počet bloků v souborovém systému.
  • Volné: Počet volných bloků v souborovém systému.
  • Dostupné: Počet volných bloků dostupných pro běžné uživatele (ne root).

Inody:

  • Celkem: Celkový počet inodů v souborovém systému.
  • Volné: Počet volných inodů v souborovém systému.

Dereferencování symbolických odkazů

Pokud spustíte stat na symbolický odkaz, vypíše informace o samotném odkazu. Pokud chcete informace o souboru, na který odkazuje, použijte volbu -L (dereference). Soubor code.c je symbolický odkaz na ana.c. Podívejme se na to bez volby -L:

stat code.c

Vidíme, že název souboru je code.c a ukazuje (->) na ana.c. Velikost souboru je pouhých 11 bajtů a nezabírá žádné bloky. Typ souboru je symbolický odkaz.

To znamená, že se nedíváme na skutečný soubor. Nyní zkusíme totéž, ale s volbou -L:

stat -L code.c

Nyní se zobrazují detaily souboru, na který symbolický odkaz ukazuje. Všimněte si však, že název souboru je stále code.c. Je to název symbolického odkazu, ne cílového souboru.

Stručný výpis

Volba -t (terse) způsobí zobrazení zkráceného výpisu:

stat -t ana.c

Výstup je bez popisků. Pro jeho pochopení je potřeba mít dobrou znalost jednotlivých položek standardního výpisu.

Vlastní formáty výstupu

Lepším způsobem, jak získat specifické informace ze stat, je použitím vlastních formátů. Existuje seznam tokenů, které se nazývají formátovací sekvence. Každá z nich představuje konkrétní datovou položku. Vyberte si ty, které potřebujete a vytvořte z nich formátovací řetězec. Při použití stat s tímto řetězcem získáte jen ty datové položky, které jste si vybrali.

Existují dvě sady formátovacích sekvencí – pro soubory a pro souborové systémy. Seznam pro soubory:

  • %a: Přístupová práva v osmičkové soustavě.
  • %A: Přístupová práva v čitelné formě (rwx).
  • %b: Počet přidělených bloků.
  • %B: Velikost každého bloku v bajtech.
  • %d: Číslo zařízení v desítkové soustavě.
  • %D: Číslo zařízení v hexadecimální soustavě.
  • %f: Surový režim v hexadecimální soustavě.
  • %F: Typ souboru.
  • %g: ID skupiny vlastníka.
  • %G: Název skupiny vlastníka.
  • %h: Počet pevných odkazů.
  • %i: Číslo inodu.
  • %m: Bod připojení.
  • %n: Název souboru.
  • %N: Název souboru v uvozovkách s dereferencovaným názvem souboru, pokud se jedná o symbolický odkaz.
  • %o: Doporučená optimální velikost I/O přenosu.
  • %s: Celková velikost v bajtech.
  • %t: Hlavní typ zařízení v hexadecimální soustavě pro speciální soubory.
  • %T: Vedlejší typ zařízení v hexadecimální soustavě pro speciální soubory.
  • %u: ID uživatele vlastníka.
  • %U: Uživatelské jméno vlastníka.
  • %w: Čas narození souboru, v lidsky čitelné formě nebo spojovník (-) pokud není znám.
  • %W: Čas narození souboru, sekundy od epochy (0, pokud není známo).
  • %x: Čas posledního přístupu, v lidsky čitelné formě.
  • %X: Čas posledního přístupu, sekundy od epochy.
  • %y: Čas poslední úpravy dat, v lidsky čitelné formě.
  • %Y: Čas poslední úpravy dat, sekundy od epochy.
  • %z: Čas poslední změny stavu, v lidsky čitelné formě.
  • %Z: Čas poslední změny stavu, sekundy od epochy.

„Epochou“ se myslí Unixová epocha, která začala 1. ledna 1970 v 00:00:00 UTC.

Seznam formátovacích sekvencí pro souborové systémy:

  • %a: Počet volných bloků dostupných běžným uživatelům (ne root).
  • %b: Celkový počet bloků dat v souborovém systému.
  • %c: Celkový počet inodů v souborovém systému.
  • %d: Počet volných inodů v souborovém systému.
  • %f: Počet volných bloků v souborovém systému.
  • %i: ID souborového systému v šestnáctkové soustavě.
  • %l: Maximální délka názvu souboru.
  • %n: Název souboru.
  • %s: Velikost bloku (optimální velikost zápisu).
  • %S: Velikost bloků souborového systému (pro počet bloků).
  • %t: Typ systému souborů v hexadecimální soustavě.
  • %T: Typ systému souborů v lidsky čitelné formě.

Existují dvě volby, které přijímají formátovací řetězce – --format a --printf. Rozdíl je v tom, že --printf interpretuje únikové sekvence (jako \n pro nový řádek a \t pro tabulátor) a automaticky nepřidává nový řádek do výstupu.

Nyní vytvořme formátovací řetězec a použijeme ho v stat. Budeme používat %n pro název souboru, %s pro velikost a %F pro typ souboru. Přidáme \n únikovou sekvenci na konec řetězce, abychom zajistili, že každý soubor bude zobrazen na novém řádku. Náš formátovací řetězec bude vypadat takto:

"File %n is %s bytes, and is a %F\n"

Tento řetězec použijeme s volbou --printf. Požádáme stat o informace o souboru code.c a všech souborech odpovídajících ana.?. Kompletní příkaz:

stat --printf="File %n is %s bytes, and is a %F\n" code.c ana/ana.?

Zpráva o každém souboru se zobrazí na novém řádku a obsahuje název souboru, jeho velikost a typ.

Vlastní formáty vám umožní přístup k ještě většímu množství dat než standardní výstup stat.

Precizní kontrola detailů

Jak vidíte, máte k dispozici široké spektrum voleb, pro získání přesně těch datových prvků, které potřebujete. A proto je použití aliasů u delších a složitějších příkazů velmi doporučováno.