Hur man använder stat-kommandot på Linux

By rik

Linux-kommandot `stat` ger dig en betydligt djupare inblick i filsystemet än vad `ls` gör. Det är ett informativt och anpassningsbart verktyg som låter dig utforska systemet på ett mer detaljerat sätt. Låt oss undersöka hur det används.

`stat` – En djupare titt

Kommandot `ls` är effektivt för sina avsedda uppgifter, men i Linux finns det ofta möjligheter att gräva djupare och se vad som finns under ytan. Det handlar inte bara om att lyfta på mattan, utan att dra upp golvbrädorna och gräva djupa hål. Linux kan betraktas som en lök, där varje lager kan skalas bort.

`ls` visar viktig information om en fil, som dess behörigheter, storlek och om det är en fil eller symbolisk länk. Denna information hämtas från en filsystemstruktur som kallas inod.

Varje fil och katalog har en egen inod, som lagrar metadata om filen, som vilka filsystemblock den använder och tillhörande tidsstämplar. Inoden är som filens bibliotekskort, men `ls` visar endast en del av informationen. För att se allt behöver vi använda `stat`.

Precis som `ls`, har `stat` många alternativ. Det gör det till ett utmärkt verktyg för att använda alias. När du väl har identifierat de inställningar som ger dig den önskade informationen, kan du kapsla in den i ett alias eller en skalfunktion. Det gör användningen smidigare och du slipper memorera en komplex uppsättning kommandoradsalternativ.

En kort jämförelse

Låt oss börja med att använda `ls` för att få en detaljerad lista (`-l`) med filstorlekar som är lätta att läsa (`-h`):

ls -lh ana.h

Informationen `ls` presenterar är följande (från vänster till höger):

Det inledande tecknet (`-`) indikerar att det är en vanlig fil, inte en socket, symbolisk länk eller annan typ av objekt.
Filens ägar-, grupp- och andra behörigheter visas i oktalt format.
Antalet hårda länkar som pekar på filen, vanligtvis en.
Filens ägare (här: dave).
Gruppens ägare (här: dave).
Filens storlek (här: 802 byte).
Tidpunkten då filen senast ändrades (här: Fredag 13 december 2015).
Filens namn (här: ana.c).

Låt oss nu se vad `stat` visar:

stat ana.h

Informationen vi får från `stat` är:

Fil: Filens namn, vanligtvis samma som det som angavs i kommandot, men det kan vara annorlunda vid symboliska länkar.
Storlek: Filens storlek i byte.
Block: Antalet filsystemblock som filen kräver för att lagras.
IO-block: Storleken på ett filsystemblock.
Filtyp: Typen av objekt som beskrivs, vanligen filer eller kataloger, men kan även vara länkar, sockets eller namngivna rör.
Enhet: Enhetens nummer i hexadecimal och decimal form. Detta identifierar den hårddisk där filen är lagrad.
Inod: Inodens nummer, filens unika ID. Inodnumret och enhetsnumret identifierar filen unikt.
Länkar: Antalet hårda länkar som pekar på filen. Varje länk har sin egen inod. Detta tal anger antalet inoder som pekar på filen. När en länk skapas eller raderas, justeras detta tal. När talet når noll, raderas filen och dess inod. Vid användning på en katalog visar det antalet filer i katalogen, inklusive ”.” (aktuell katalog) och ”..” (överordnad katalog).
Åtkomst: Filens behörigheter i oktalt och rwx (läs, skriv, kör) format.
Uid: Användar-ID och användarnamn för filens ägare.
Gid: Grupp-ID och gruppnamn för filens ägare.
Åtkomst: Tidsstämpel för senaste åtkomst. Moderna Linux-distributioner använder `relatime` för att optimera uppdatering av åtkomsttiden. Enkelt uttryckt uppdateras åtkomsttiden endast om den är äldre än ändringstiden.
Ändra: Tidsstämpel för senaste ändring av filens innehåll.
Ändra: Tidsstämpel för senaste ändring av filens attribut eller innehåll. Ändras filens behörigheter, uppdateras den här tidsstämpeln, men inte ”Ändra”.
Födelse: Reserverad för ursprunglig skapandetid, men inte implementerad i Linux.

Tidsstämplarna

Tidsstämplarna är tidszonsberoende. I slutet av varje tidsstämpel ser man ”-0500”, vilket indikerar att filen skapades på en dator i en UTC-tidszon som är fem timmar före den aktuella datorns. Med andra ord är den här datorn fem timmar efter den dator som skapade filen. I detta fall skapades filen på en brittisk tidszonsdator, och vi tittar på den på en dator i US Eastern Standard tidszon.

De två tidsstämplarna ”Ändra” och ”Ändra” kan orsaka förvirring, då deras namn låter som om de betyder samma sak.

Låt oss ändra filbehörigheterna för en fil, till exempel `ana.c`, med hjälp av `chmod`. Vi gör filen skrivbar för alla. Det kommer inte påverka filens innehåll, men det kommer att ändra filens attribut:

chmod +w ana.c

Nu tittar vi på tidsstämplarna med `stat`:

stat ana.c

Vi ser att ”Ändra”-tidsstämpeln har uppdaterats, men inte ”Ändra”.

”Ändra”-tidsstämpeln uppdateras endast om filens innehåll har ändrats. ”Ändra”-tidsstämpeln uppdateras både vid ändringar i innehållet och attributen.

`stat` med flera filer

För att få en statisk rapport om flera filer samtidigt, ange filnamnen som argument till `stat`:

stat ana.h ana.o

Du kan använda mönstermatchning för att använda `stat` på flera filer samtidigt. Frågetecknet `?` representerar ett enskilt tecken, och asterisken `*` representerar vilken teckensträng som helst. För att rapportera om alla filer som börjar med `ana` och har en bokstav som suffix, används detta kommando:

stat ana.?

`stat` för filsystem

`stat` kan inte bara ge information om filer utan också om filsystem. Med alternativet `-f` (`–file-system`) rapporterar `stat` om filsystemet där filen finns. Istället för ett filnamn kan även en katalog, till exempel `/`, anges som argument:

stat -f ana.c

Informationen som presenteras är:

Fil: Filens namn.
ID: Filsystemets ID i hexadecimal form.
Namelen: Maximalt tillåten längd på filnamn.
Typ: Filsystemets typ.
Blockstorlek: Optimal storlek för läsbegäran för snabb dataöverföring.
Grundläggande blockstorlek: Storleken på varje filsystemsblock.

Block:

Totalt: Det totala antalet block i filsystemet.
Gratis: Antalet lediga block i filsystemet.
Tillgängligt: Antalet fria block som är tillgängliga för vanliga (icke-root) användare.

Inoder:

Totalt: Det totala antalet inoder i filsystemet.
Gratis: Antalet lediga inoder i filsystemet.

Symboliska länkar

Om du använder `stat` på en fil som är en symbolisk länk, kommer den att rapportera om själva länken. För att rapportera om filen som länken pekar på, använd alternativet `-L` (dereference). Om filen `code.c` är en symbolisk länk till `ana.c`, visas följande om vi inte använder `-L`:

stat code.c

Filnamnet visar `code.c` som pekar på (`->`) `ana.c`. Storleken är 11 byte. Noll block används för att lagra länken. Filtypen visas som en symbolisk länk.

Vi undersöker alltså inte den faktiska filen. Låt oss göra om det och lägga till `-L`:

stat -L code.c

Nu visas detaljerna för filen som den symboliska länken pekar på. Filnamnet är dock fortfarande `code.c`, vilket är namnet på länken, inte målfilen. Det beror på att det är namnet vi angav i kommandot.

Kompakt rapport

Med alternativet `-t` (terse) ger `stat` en komprimerad sammanfattning:

stat -t ana.c

Utan ledtrådar kan det vara svårt att förstå utdata innan man har memorerat fältsekvensen. Därför är det bra att ha en fullständig `stat`-utdata för referens.

Anpassade format

Ett bättre sätt att få ut anpassad information från `stat` är att använda egna format. Det finns en lång lista med token, formatsekvenser, som representerar olika dataelement. Du kan välja de du behöver och skapa en formatsträng. När du anropar `stat` med formatsträngen, visas endast de dataelement du begärde.

Det finns olika formatsekvenser för filer och filsystem. Listan för filer är:

%a: Åtkomsträttigheter i oktalt format.
%A: Åtkomsträttigheter i rwx (läsbar) form.
%b: Antalet allokerade block.
%B: Storleken i byte för varje block.
%d: Enhetsnumret i decimal.
%D: Enhetsnumret i hex.
%f: Råläget i hex.
%F: Filtypen.
%g: Ägarens grupp-ID.
%G: Ägarens gruppnamn.
%h: Antalet hårda länkar.
%i: Inodnumret.
%m: Monteringspunkten.
%n: Filens namn.
%N: Det citerade filnamnet, med det refererade filnamnet om det är en symbolisk länk.
%o: Tips om optimal I/O-överföringsstorlek.
%s: Filens totala storlek i byte.
%t: Huvudenhetstypen i hex för specialfiler (tecken/blockenhet).
%T: Mindretalet i hex, för specialfiler för tecken/blockenhet.
%u: Ägarens användar-ID.
%U: Ägarens användarnamn.
%w: Filens skapandetid (läsbar eller ”-”).
%W: Filens skapandetid i sekunder sedan epoken (0 om okänd).
%x: Senaste åtkomsttid (läsbar).
%X: Senaste åtkomsttid i sekunder sedan epoken.
%y: Senaste dataändringstid (läsbar).
%Y: Senaste dataändringstid i sekunder sedan epoken.
%z: Senaste statusändringstid (läsbar).
%Z: Senaste statusändringstid i sekunder sedan epoken.

”Epoken” är Unix-epoken som började 1970-01-01 00:00:00 +0000 (UTC).

För filsystem är formatsekvenserna:

%a: Antal fria block tillgängliga för vanliga (icke-root) användare.
%b: Totalt antal datablock i filsystemet.
%c: Totalt antal inoder i filsystemet.
%d: Antal fria inoder i filsystemet.
%f: Antal lediga block i filsystemet.
%i: Filsystemets ID i hexadecimal form.
%l: Maximala längden på filnamn.
%n: Filnamnet.
%s: Blockstorleken (optimal skrivstorlek).
%S: Filsystemblockens storlek (för blockantal).
%t: Filsystemets typ i hexadecimal form.
%T: Filsystemets typ (läsbar form).

Det finns två alternativ som accepterar formatsträngar: `–format` och `–printf`. Skillnaden är att `–printf` tolkar C-style escape-sekvenser som `\n` för ny rad och `\t` för tab. `–printf` lägger inte heller till en ny rad i utdata automatiskt.

Låt oss skapa en formatsträng och skicka den till `stat`. Vi använder `%n` för filnamn, `%s` för storlek och `%F` för filtyp. Vi lägger till escape-sekvensen `\n` för att få varje fil på en ny rad. Formatsträngen blir då:

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

Vi använder detta med `–printf`. Vi vill att `stat` ska rapportera om `code.c` och filer som matchar `ana.?`. Kommandot blir då (observera `=` mellan `–printf` och formatsträngen):

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

Rapporten för varje fil visas på en ny rad, som vi önskade. Filnamn, storlek och filtyp anges.

Med anpassade format får du tillgång till fler dataelement än med standardinställningarna.

Finkornig kontroll

Som du ser, är möjligheterna att extrahera specifika dataelement mycket stora. Det är också lätt att förstå varför det är bra att använda alias för de mer komplexa kommandona.