Hvordan bruke stat-kommandoen på Linux

Linux stat-kommandoen viser deg mye mer detaljer enn ls gjør. Ta en titt bak gardinen med dette informative og konfigurerbare verktøyet. Vi viser deg hvordan du bruker den.

stat tar deg bak kulissene

ls-kommandoen er utmerket på hva den gjør – og den gjør mye – men med Linux ser det ut til at det alltid er en måte å gå dypere og se hva som ligger under overflaten. Og ofte er det ikke bare et tilfelle av å løfte kanten av teppet. Du kan rive opp gulvbordene og deretter grave et hull. Du kan skrelle Linux som en løk.

ls vil vise deg en god del informasjon om en fil, for eksempel hvilke tillatelser som er satt på den, og hvor stor den er, og om det er en fil eller en symbolsk lenke. For å vise denne informasjonen leser jeg den fra en filsystemstruktur kalt en inode.

Hver fil og katalog har en inode. Inoden holder metadata om filen, for eksempel hvilke filsystemblokker den opptar, og datostemplene knyttet til filen. Inoden er som et lånekort for filen. Men jeg vil bare vise deg noe av informasjonen. For å se alt, må vi bruke stat-kommandoen.

Som ls har stat-kommandoen mange alternativer. Dette gjør den til en god kandidat for bruk av aliaser. Når du har oppdaget et bestemt sett med alternativer som gjør at stat gir deg utdataene du vil ha, pakk den inn i en alias- eller skallfunksjon. Dette gjør det mye mer praktisk å bruke, og du trenger ikke å huske et mystisk sett med kommandolinjealternativer.

En rask sammenligning

La oss bruke ls for å gi oss en lang liste (-l-alternativ) med filstørrelser som kan leses av mennesker (-h-alternativ):

ls -lh ana.h

Fra venstre til høyre er informasjonen som ls gir:

Det aller første tegnet er en bindestrek «-«, og dette forteller oss at filen er en vanlig fil og ikke en socket, symbolkobling eller en annen type objekt.
Eieren, gruppen 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 en.
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 det det samme som navnet vi sendte til stat på kommandolinjen, men det kan være annerledes hvis vi ser på en symbolsk lenke.
Størrelse: Størrelsen på filen i byte.
Blokkerer: 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 de 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 link har sin egen inode. Så en annen måte å tenke på denne figuren på er hvor mange inoder som peker til denne filen. Hver gang en hard link opprettes eller slettes, vil dette tallet bli justert opp eller ned. Når den 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 et opplegg kalt relatime, som prøver å optimalisere harddiskskrivingene som kreves for å oppdatere tilgangstiden. Enkelt sagt oppdateres tilgangstiden hvis den er eldre enn den endrede tiden.
Endre: Tidsstempelet for endring. Dette er tidspunktet da filens innhold sist ble endret. (Som flaksen ville ha det, ble innholdet i denne filen sist endret for fire år siden til i dag.)
Endre: Tidsstempelet for endring. Dette er tidspunktet 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.

  Hvordan installere LosslessCut på Linux

Forstå tidsstemplene

Tidsstemplene er tidssonesensitive. -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.

Endre og endre tidsstemplene kan forårsake forvirring fordi navnene deres høres ut som om de betyr det samme for de uinnvidde.

La oss bruke chmod til å endre filtillatelsene på en fil kalt ana.c. Vi skal gjøre det skrivbart 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 det endrede har ikke blitt det.

  Hvordan installere Kali Linux-apper i Debian

Det endrede tidsstemplet vil bare bli oppdatert 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 på flere filer samtidig, send 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 fortelle stat å rapportere om hvilken som helst fil kalt «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

Informasjonsstatistikken gir oss er:

Fil: Navnet på filen.
ID: Filsystem-IDen 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 ønsket at stat skulle rapportere om filen som lenken peker til, bruk 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.

Terse-rapporten

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

stat -t ana.c

Det er ingen ledetråder gitt. For å forstå det – inntil du har husket feltsekvensen – må du kryssreferanser denne utgangen til en full statutgang.

Egendefinerte utdataformater

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

  Hvordan enkelt laste ned og installere apper på Linux med AppImage Pool

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 blokker tildelt.
%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-IDen 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-IDen til eieren.
%U: Brukernavnet til eieren.
%w: Tidspunktet for filens fødsel, lesbar av 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: Tiden 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-epokensom fant sted 1970-01-01 00:00:00 +0000 (UTC).

For filsystemer er formatsekvensene:

%a: Antallet gratis 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-IDen 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: filsystemtype i menneskelesbar form.

Det er to alternativer som godtar strenger med formatsekvenser. Disse er –format og –printf. Forskjellen mellom dem er –printf tolker C-stil rømningssekvenser slik som nylinje 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 som skulle brukes er %n for filnavn, %s for størrelsen på filen og %F for filtypen. Vi skal legge til n escape-sekvensen til slutten av strengen for å sikre at hver fil håndteres på en ny linje. Formatstrengen vår ser slik ut:

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

Vi skal overføre dette til stat ved å bruke –printf-alternativet. Vi kommer til å 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="File %n is %s bytes, and is a %Fn" code.c ana/ana.?

stat --printf=

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 statutdata.

Finkornkontroll

Som du kan se, er det et enormt omfang 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 besvergelser.