Hvordan få størrelsen på en fil eller katalog i Linux

Når du bruker Linux- dukommandoen, får du både den faktiske diskbruken og den virkelige størrelsen på en fil eller katalog. Vi forklarer hvorfor disse verdiene ikke er de samme.

Faktisk diskbruk og ekte størrelse

Størrelsen på en fil og plassen den tar på harddisken er sjelden den samme. Diskplass tildeles i blokker. Hvis en fil er mindre enn en blokk, blir en hel blokk allikevel tildelt den fordi filsystemet ikke har en mindre eiendomsenhet å bruke.

Med mindre en filstørrelse er et nøyaktig multiplum av blokker, må plassen den bruker på harddisken alltid avrundes til neste helblokk. For eksempel, hvis en fil er større enn to blokker, men mindre enn tre, tar det fortsatt tre blokker med plass å lagre den.

To målinger brukes i forhold til filstørrelse. Den første er den faktiske størrelsen på filen, som er antall byte med innhold som utgjør filen. Den andre er den effektive størrelsen på filen på harddisken. Dette er antall filsystemblokker som er nødvendige for å lagre den filen.

Et eksempel

La oss se på et enkelt eksempel. Vi omdirigerer et enkelt tegn til en fil for å lage en liten fil:

ekko "1"> geek.txt

Nå bruker vi langformatoppføringen  ls, for å se på fillengden:

ls -l geek.txt

Lengden er den numeriske verdien som følger dave dave  oppføringene, som er to byte. Hvorfor er det to byte når vi bare sendte ett tegn til filen? La oss ta en titt på hva som skjer inne i filen.

Vi bruker hexdumpkommandoen, som gir oss et nøyaktig antall byte og tillater oss å "se" tegn som ikke er utskrevet som heksadesimale verdier. Vi bruker også alternativet -C(kanonisk) for å tvinge utdataene til å vise heksadesimale verdier i utgangen, så vel som deres alfanumeriske tegnekvivalenter:

hexdump -C geek.txt

Utgangen viser oss at det begynner ved forskyvning 00000000 i filen, at det er en byte som inneholder en heksadesimal verdi på 31, og en som inneholder en heksadesimal verdi på 0A. Den høyre delen av utgangen viser disse verdiene som alfanumeriske tegn, hvor det er mulig.

Den heksadesimale verdien av 31 brukes til å representere tallet. Den heksadesimale verdien av 0A brukes til å representere linjetilførselstegnet, som ikke kan vises som et alfanumerisk tegn, så det vises i stedet for en periode (.). Line Feed-tegnet er lagt til av echo. echoStarter som standard  en ny linje etter at den viser teksten den trenger for å skrive til terminalvinduet.

Det stemmer med utdataene fra  ls og stemmer med fillengden på to byte.

RELATERT: Hvordan bruke ls Command til å liste opp filer og kataloger på Linux

Nå bruker vi dukommandoen til å se på filstørrelsen:

du geek.txt

Det står at størrelsen er fire, men fire av hva?

Det er blokker, og så er det blokker

Når du rapporterer filstørrelser i blokker, avhenger størrelsen den bruker av flere faktorer. Du kan spesifisere hvilken blokkstørrelse den skal bruke på kommandolinjen. Hvis du ikke tvinger dutil å bruke en bestemt blokkstørrelse, følger den et sett med regler for å bestemme hvilken du vil bruke.

Først sjekker den følgende miljøvariabler:

  • DU_BLOCK_SIZE
  • BLOCK_SIZE
  • BLOKKESTØRRELSE

Hvis noen av disse eksisterer, er blokkstørrelsen satt, og duslutter å sjekke. Hvis ingen er angitt, er  dustandardverdien en blokkstørrelse på 1 024 byte. Med mindre det er satt en miljøvariabel kalt POSIXLY_CORRECT. Hvis det er tilfelle, er dustandardinnstillingen en blokkstørrelse på 512 byte.

Så hvordan finner vi ut hvilken som er i bruk? Du kan sjekke hver miljøvariabel for å finne ut, men det er en raskere måte. La oss sammenligne resultatene med blokkstørrelsen filsystemet bruker i stedet.

For å oppdage blokkstørrelsen filsystemet bruker, bruker vi tune2fsprogrammet. Vi bruker deretter alternativet -l(liste superblokk), rør utgangen grep, og skriver deretter ut linjer som inneholder ordet "Blokker".

I dette eksemplet ser vi på filsystemet på den første partisjonen på den første harddisken sda1, og vi må bruke sudo:

sudo tune2fs -l / dev / sda1 | grep Block

Blokkstørrelsen på filsystemet er 4096 byte. Hvis vi deler det med resultatet vi fikk fra du (fire), viser det at  du standard blokkstørrelse er 1024 byte. Vi vet nå flere viktige ting.

Først vet vi at den minste mengden filsystemer som kan brukes til å lagre en fil er 4096 byte. Dette betyr at selv den lille, to byte filen tar opp 4 kB harddiskplass.

Den andre tingen å huske på er programmer dedikert til rapportering på harddisken og filsystem statistikk, for eksempel du, lsog  tune2fskan ha ulike oppfatninger av hva “blokk” betyr. Den tune2fssøknad rapporterer sanne filsystem blokkstørrelser, samtidig  lsog dukan være konfigurert eller tvunget til å bruke andre blokkstørrelser. Disse blokkstørrelsene er ikke ment å forholde seg til filsystemets blokkstørrelse; de er bare "biter" disse kommandoene bruker i utdataene sine.

Til slutt, bortsett fra å bruke forskjellige blokkstørrelser,  formidler svarene fra duog tune2fsden samme betydningen. Den tune2fsResultatet var en blokk på 4096 bytes, og duresultatet var fire blokker på 1024 bytes.

Ved hjelp av du

Uten kommandolinjeparametere eller alternativer, duviser den totale diskplassen den gjeldende katalogen og alle underkataloger bruker.

La oss se på et eksempel:

du

Størrelsen er rapportert i standard blokkstørrelse på 1024 byte per blokk. Hele underkatalogstreet krysses.

Bruke dupå en annen katalog

Hvis du vil  du rapportere om en annen katalog enn den nåværende, kan du sende banen til katalogen på kommandolinjen:

du ~ / .cach / evolusjon /

Bruke dupå en bestemt fil

Hvis du vil  du rapportere om en bestemt fil, sender du banen til den filen på kommandolinjen. Du kan også sende et skallmønster til en valgt gruppe filer, for eksempel *.txt:

du ~ / .bash_aliases

Rapportering om filer i kataloger

For å ha durapport om filene i gjeldende katalog og underkataloger, bruk alternativet -a(alle filer):

du -a

For hver katalog rapporteres størrelsen på hver fil, samt en total for hver katalog.

Begrensende katalogtreddybde

Du kan fortelle duå liste katalogtreet til en viss dybde. For å gjøre dette, bruk alternativet -d(maks dybde) og oppgi en dybdeverdi som parameter. Merk at alle underkataloger blir skannet og brukt til å beregne de rapporterte totalene, men de er ikke alle oppført. For å angi en maksimal katalogdybde på ett nivå, bruk denne kommandoen:

du -d 1

Utgangen viser den totale størrelsen på den underkatalogen i den gjeldende katalogen, og gir også en total for hver enkelt.

For å liste kataloger ett nivå dypere, bruk denne kommandoen:

du -d 2

Angi blokkstørrelse

Du kan bruke blockalternativet til å angi en blokkstørrelse du for den aktuelle operasjonen. For å bruke en blokkstørrelse på en byte, bruk følgende kommando for å få de nøyaktige størrelsene på katalogene og filene:

du --block = 1

Hvis du vil bruke en blokkstørrelse på en megabyte, kan du bruke alternativet -m(megabyte), som er det samme som --block=1M:

du -m

Hvis du vil ha størrelsene rapportert i den mest hensiktsmessige blokkstørrelsen i henhold til diskplass som brukes av kataloger og filer, bruker du alternativet -h(lesbart for mennesker):

du -h

For å se den tilsynelatende størrelsen på filen i stedet for hvor mye harddiskplass som brukes til å lagre filen, bruker du --apparent-sizealternativet:

du --appar-size

Du kan kombinere dette med alternativet -a(alle) for å se den tilsynelatende størrelsen på hver fil:

du --apparent-size -a

Hver fil er oppført, sammen med den tilsynelatende størrelsen.

Viser bare totalt

Hvis du bare vil  du rapportere totalsummen for katalogen, bruker du alternativet -s(oppsummer). Du kan også kombinere dette med andre alternativer, for eksempel alternativet -h(som kan leses av mennesker):

du -h -s

Her bruker vi det med --apparent-sizealternativet:

du --apparent-size -s

Viser endringstider

For å se opprettelsen eller siste modifikasjonstid og dato, bruk --timealternativet:

du --tid -d 2

Merkelige resultater?

Hvis du ser rare resultater fra du, spesielt når du kryssrefererer størrelser til utdata fra andre kommandoer, skyldes det vanligvis de forskjellige blokkstørrelsene som forskjellige kommandoer kan settes til, eller de som de standardiserer til. Det kan også skyldes forskjellene mellom virkelige filstørrelser og diskplassen som kreves for å lagre dem.

Hvis du trenger å matche utdataene fra andre kommandoer, kan du eksperimentere med --blockalternativet i du.