Linux `stat`: Få full oversikt over filer og filsystemer!

Linux-kommandoen `stat` avslører langt flere detaljer enn det `ls` gjør. Ta et dypdykk bak kulissene med dette informative og fleksible verktøyet. Vi viser deg hvordan du bruker det.

`stat` gir deg innsikt bak fasaden

Kommandoen `ls` er utmerket i sin funksjon – og den gjør mye – men i Linux finnes det som regel alltid en metode for å utforske dypere og se hva som ligger under overflaten. Og ofte handler det ikke bare om å løfte litt på teppet. Du kan rive opp gulvplankene og grave et hull. Du kan skrelle Linux som en løk.

`ls` viser en god del informasjon om en fil, for eksempel hvilke rettigheter som er satt for den, hvor stor den er, og om det er en fil eller en symbolsk lenke. For å vise denne informasjonen leser den fra en filsystemstruktur som kalles en inode.

Hver fil og katalog har en inode. Inoden lagrer metadata om filen, som for eksempel hvilke filsystemblokker den opptar, og tidsstempler knyttet til filen. Inoden er som et lånekort for filen. Men `ls` viser bare noe av informasjonen. For å se alt, må vi bruke kommandoen `stat`.

I likhet med `ls` har kommandoen `stat` mange alternativer. Dette gjør den til en god kandidat for bruk av aliaser. Når du har funnet et bestemt sett med alternativer som får `stat` til å generere den ønskede utdataen, kan du pakke det inn i et alias eller en skallfunksjon. Dette gjør det mer praktisk å bruke, og du slipper å huske et kryptisk sett med kommandolinjealternativer.

En rask sammenligning

La oss bruke `ls` for å gi oss en lang liste (-l-alternativ) med filstørrelser som er lesbare for mennesker (-h-alternativ):

ls -lh ana.h

Informasjonen `ls` gir, fra venstre til høyre, er:

Det første tegnet er en bindestrek «-«, som forteller oss at filen er en vanlig fil, og ikke en socket, symbolsk kobling eller en annen type objekt.
Eier-, gruppe- og andre tillatelser er oppført i oktalt format.
Antallet harde lenker som peker til denne filen. I dette tilfellet, og i de fleste tilfeller, vil det være én.
Fileieren er dave.
Gruppeeieren er dave.
Filstørrelsen er 802 byte.
Filen ble sist endret fredag 13. desember 2015.
Filnavnet er ana.c.

La oss ta en titt med `stat`:

stat ana.h

Informasjonen vi får fra `stat` er:

Fil: Navnet på filen. Vanligvis er dette det samme som navnet vi ga `stat` på kommandolinjen, men det kan være annerledes hvis vi ser på en symbolsk lenke.
Størrelse: Størrelsen på filen i byte.
Blokker: Antall filsystemblokker filen krever for å kunne lagres på harddisken.
IO-blokk: Størrelsen på en filsystemblokk.
Filtype: Type objekt metadataene beskriver. De vanligste typene er filer og kataloger, men det kan også være lenker, sockets eller navngitte rør.
Enhet: Enhetsnummeret i heksadesimal og desimal. Dette er ID-en til harddisken filen er lagret på.
Inode: Inodenummeret. Det vil si ID-nummeret til denne inoden. Sammen identifiserer inodenummeret og enhetsnummeret en fil unikt.
Lenker: Dette tallet angir hvor mange harde lenker som peker til denne filen. Hver hard lenke har sin egen inode. Så en annen måte å tenke på dette tallet er hvor mange inoder som peker til denne filen. Hver gang en hard lenke opprettes eller slettes, vil dette tallet justeres opp eller ned. Når det når null, er selve filen slettet, og inoden fjernes. Hvis du bruker `stat` på en katalog, representerer dette tallet antall filer i katalogen, inkludert «.» oppføring for gjeldende katalog og «..» oppføring for overordnet katalog.
Tilgang: Filtillatelsene vises i deres oktale og tradisjonelle rwx (lese, skrive, kjøre formater).
Uid: Bruker-ID og kontonavn til eieren.
Gid: Gruppe-ID og kontonavn til eieren.
Tilgang: Tidsstempelet for tilgang. Ikke så enkelt som det kan virke. Moderne Linux-distribusjoner bruker en ordning som kalles relatime, som prøver å optimalisere harddiskskrivingene som kreves for å oppdatere tilgangstiden. Enkelt sagt oppdateres tilgangstiden hvis den er eldre enn endringstiden.
Endre: Tidsstempelet for endring. Dette er tidspunktet da filens innhold sist ble endret. (Som tilfeldighetene ville ha det, ble innholdet i denne filen sist endret for fire år siden til i dag.)
Endre: Tidsstempelet for endring. Dette er tidspunktet da filens attributter eller innhold sist ble endret. Hvis du endrer en fil ved å angi nye filtillatelser, vil endringstidsstempelet bli oppdatert (fordi filattributtene har endret seg), men det endrede tidsstemplet vil ikke bli oppdatert (fordi filinnholdet ikke ble endret).
Fødsel: Reservert for å vise den opprinnelige opprettelsesdatoen for filen, men dette er ikke implementert i Linux.

Forstå tidsstemplene

Tidsstemplene er tidssonefølsomme. -0500 på slutten av hver linje viser at denne filen ble opprettet på en datamaskin i en Koordinert universell tid (UTC) tidssone som er fem timer foran tidssonen til gjeldende datamaskin. Så denne datamaskinen er fem timer bak datamaskinen som opprettet denne filen. Faktisk ble filen opprettet på en britisk tidssonedatamaskin, og vi ser på den her på en datamaskin i tidssonen US Eastern Standard.

Endrings- og modifiseringstidsstemplene kan skape forvirring, fordi navnene deres for de uinnvidde høres ut som de betyr det samme.

La oss bruke `chmod` for å endre filrettighetene til en fil som heter `ana.c`. Vi skal gjøre den skrivbar for alle. Dette vil ikke påvirke innholdet i filen, men det vil påvirke attributtene til filen.

chmod +w ana.c

Og så bruker vi `stat` for å se på tidsstemplene:

stat ana.c

Tidsstempelet for endring er oppdatert, men modifiseringstempelet har ikke blitt det.

Modifiseringstempelet vil bare oppdateres hvis innholdet i filen endres. Tidsstempelet for endring oppdateres for både innholdsendringer og attributtendringer.

Bruke `stat` med flere filer

For å få en `stat`-rapport for flere filer samtidig, sender du filnavnene til `stat` på kommandolinjen:

stat ana.h ana.o

For å bruke `stat` på et sett med filer, bruk mønstertilpasning. Spørsmålstegnet «?» representerer et enkelt tegn, og stjernen «*» representerer en hvilken som helst streng med tegn. Vi kan be `stat` om å rapportere om en hvilken som helst fil som heter «ana» med en enkeltbokstavsutvidelse, med denne kommandoen:

stat ana.?

Bruke `stat` for å rapportere om filsystemer

`stat` kan rapportere om statusen til filsystemene, så vel som statusen til filene. Alternativet -f (filsystem) forteller `stat` å rapportere om filsystemet som filen ligger på. Merk at vi også kan sende en katalog som «/» til `stat` i stedet for et filnavn.

stat -f ana.c

Informasjonen statistikken gir oss, er:

Fil: Navnet på filen.
ID: Filsystem-ID-en i heksadesimal notasjon.
Namelen: Maksimal tillatt lengde for filnavn.
Type: Type filsystem.
Blokkstørrelse: Mengden data for å be om leseforespørsler for optimale dataoverføringshastigheter.
Grunnleggende blokkstørrelse: Størrelsen på hver filsystemblokk.

Blokker:

Totalt: Totalt antall blokker i filsystemet.
Gratis: Antall ledige blokker i filsystemet.
Tilgjengelig: Antall gratis blokker tilgjengelig for vanlige (ikke-root) brukere.

Inoder:

Totalt: Totalt antall inoder i filsystemet.
Gratis: Antall ledige inoder i filsystemet.

Se bort fra symbolske lenker

Hvis du bruker `stat` på en fil som faktisk er en symbolsk lenke, vil den rapportere om lenken. Hvis du vil at `stat` skal rapportere om filen som lenken peker til, bruker du alternativet -L (dereference). Filen `code.c` er en symbolsk lenke til `ana.c`. La oss se på det uten -L-alternativet:

stat code.c

Filnavnet viser `code.c` som peker til ( -> ) `ana.c`. Filstørrelsen er bare 11 byte. Det er null blokker viet til å lagre denne koblingen. Filtypen er oppført som en symbolsk lenke.

Det er klart at vi ikke ser på selve filen her. La oss gjøre det igjen og legge til -L-alternativet:

stat -L code.c

Dette viser nå fildetaljene for filen som den symbolske lenken viser til. Men merk at filnavnet fortsatt er gitt som `code.c`. Dette er navnet på lenken, ikke målfilen. Dette skjer fordi dette er navnet vi sendte til `stat` på kommandolinjen.

Den komprimerte rapporten

Alternativet -t (terse) får `stat` til å gi et komprimert sammendrag:

stat -t ana.c

Det gis ingen ledetråder. For å forstå det – inntil du har husket feltsekvensen – må du krysse denne utdataen med en full `stat`-utdata.

Egendefinerte utdataformater

En bedre måte å få et annet sett med data fra `stat` er å bruke et tilpasset format. Det finnes en lang liste over token som kalles formatsekvenser. Hver av disse representerer et dataelement. Velg de du vil inkludere i utdataene, og lag en formatstreng. Når vi kaller `stat` og sender formatstrengen til den, vil utdataene bare inneholde dataelementene vi ba om.

Det finnes forskjellige sett med formatsekvenser for filer og filsystemer. Listen for filer er:

%a: Tilgangsrettighetene i oktal.
%A: Tilgangsrettighetene i lesbar form (rwx).
%b: Antall tildelte blokker.
%B: Størrelsen i byte for hver blokk.
%d: Enhetsnummeret i desimal.
%D: Enhetsnummeret i hex.
%f: Råmodusen i hex.
%F Filtypen.
%g: Gruppe-ID-en til eieren.
%G: Gruppenavnet til eieren.
%h: Antall harde lenker.
%i: Inodenummeret.
%m: Monteringspunktet.
%n: Filnavnet.
%N: Det siterte filnavnet, med det refererte filnavnet hvis det er en symbolsk lenke.
%o: Hint for den optimale I/O-overføringsstørrelsen.
%s: Den totale størrelsen, i byte.
%t: Hovedenhetstypen i hex, for spesialfiler for tegn-/blokkenheter.
%T: Den mindre enhetstypen i hex, for spesialfiler for tegn-/blokkenheter.
%u: Bruker-ID-en til eieren.
%U: Brukernavnet til eieren.
%w: Tidspunktet for filens fødsel, lesbart for mennesker, eller en bindestrek «-» hvis ukjent.
%W: Tidspunktet for filens fødsel, sekunder siden epoken; 0 hvis ukjent.
%x: Tidspunktet for siste tilgang, lesbart for mennesker.
%X: Tidspunktet for siste tilgang, sekunder siden epoken.
%y: Tidspunktet for siste dataendring, lesbar for mennesker.
%Y: Tidspunktet for siste dataendring, sekunder siden epoken.
%z: Tidspunktet for siste statusendring, lesbar for mennesker.
%Z: Tidspunktet for siste statusendring, sekunder siden epoken.

«Epoken» er Unix-epoken som fant sted 1970-01-01 00:00:00 +0000 (UTC).

For filsystemer er formatsekvensene:

%a: Antallet ledige blokker tilgjengelig for vanlige (ikke-root) brukere.
%b: De totale datablokkene i filsystemet.
%c: Totalt antall inoder i filsystemet.
%d: Antall ledige inoder i filsystemet.
%f: Antall ledige blokker i filsystemet.
%i: Filsystem-ID-en i heksadesimal.
%l: Maksimal lengde på filnavn.
%n: Filnavnet.
%s: Blokkstørrelsen (optimal skrivestørrelse).
%S: Størrelsen på filsystemblokker (for blokkantall).
%t: Filsystemtypen er heksadesimal.
%T: Filssystemtype i lesbar form.

Det er to alternativer som godtar strenger med formatsekvenser. Disse er `–format` og `–printf`. Forskjellen mellom dem er at `–printf` tolker C-stil rømningssekvenser som for eksempel ny linje `\n` og tab `\t`, og den legger ikke automatisk til et linjeskifttegn til utdataene.

La oss lage en formatstreng og sende den til `stat`. Formatsekvensene vi skal bruke er `%n` for filnavn, `%s` for størrelsen på filen og `%F` for filtypen. Vi skal legge til escape-sekvensen `\n` til slutten av strengen for å sikre at hver fil håndteres på en ny linje. Formatstrengen vår ser slik ut:

"Fil %n er %s byte, og er en %F\n"

Vi skal overføre dette til `stat` ved hjelp av alternativet `–printf`. Vi skal be `stat` rapportere om en fil kalt `code.c` og et sett med filer som samsvarer med `ana.?`. Dette er hele kommandoen. Legg merke til likhetstegnet «=» mellom `–printf` og formatstrengen:

stat --printf="Fil %n er %s byte, og er en %F\n" code.c ana/ana.?

Rapporten for hver fil er oppført på en ny linje, som er det vi ba om. Filnavnet, filstørrelsen og filtypen er gitt for oss.

Egendefinerte formater gir deg tilgang til enda flere dataelementer enn det som er inkludert i standard `stat`-data.

Finkornet kontroll

Som du ser, finnes det et enormt potensial for å trekke ut de spesielle dataelementene som er av interesse for deg. Du kan sikkert også se hvorfor vi anbefalte å bruke aliaser for lengre og mer komplekse kommandoer.