Sådan får du størrelsen på en fil eller et bibliotek i Linux

Når du bruger Linux- dukommandoen, får du både den faktiske diskbrug og den sande størrelse af en fil eller mappe. Vi forklarer, hvorfor disse værdier ikke er de samme.

Faktisk diskbrug og ægte størrelse

Størrelsen på en fil og den plads, den optager på din harddisk, er sjældent den samme. Diskplads tildeles i blokke. Hvis en fil er mindre end en blok, tildeles der stadig en hel blok, fordi filsystemet ikke har en mindre enhed af fast ejendom at bruge.

Medmindre en fils størrelse er et nøjagtigt multiplum af blokke, skal den plads, den bruger på harddisken, altid afrundes til den næste hele blok. For eksempel, hvis en fil er større end to blokke, men mindre end tre, tager det stadig tre blokke plads at gemme den.

To målinger bruges i forhold til filstørrelse. Den første er den faktiske størrelse på filen, hvilket er antallet af bytes af indhold, der udgør filen. Det andet er den effektive størrelse af filen på harddisken. Dette er antallet af filsystemblokke, der er nødvendige for at gemme den fil.

Et eksempel

Lad os se på et simpelt eksempel. Vi omdirigerer et enkelt tegn til en fil for at oprette en lille fil:

ekko "1"> geek.txt

Nu bruger vi listen med langt format  ls, til at se på filens længde:

ls -l geek.txt

Længden er den numeriske værdi, der følger dave dave  posterne, som er to byte. Hvorfor er det to byte, når vi kun sendte et tegn til filen? Lad os se på, hvad der sker inde i filen.

Vi bruger hexdumpkommandoen, som giver os et nøjagtigt antal byte og giver os mulighed for at "se" ikke-trykte tegn som hexadecimale værdier. Vi bruger også indstillingen -C(kanonisk) til at tvinge output til at vise hexadecimale værdier i outputteksten samt deres alfanumeriske tegnækvivalenter:

hexdump -C geek.txt

Outputtet viser os, at der fra en offset 00000000 i filen er en byte, der indeholder en hexadecimal værdi på 31, og en, der indeholder en hexadecimal værdi på 0A. Den højre del af output viser disse værdier som alfanumeriske tegn, hvor det er muligt.

Den hexadecimale værdi på 31 bruges til at repræsentere cifret. Den hexadecimale værdi på 0A bruges til at repræsentere linjefodertegnet, som ikke kan vises som et alfanumerisk tegn, så det vises i stedet for en periode (.). Line Feed-tegnet tilføjes af echo. echoStarter som standard  en ny linje, efter at den viser teksten, den har brug for, til terminalvinduet.

Det stemmer overens med output fra  ls og stemmer overens med fillængden på to byte.

RELATERET: Sådan bruges ls-kommandoen til at liste filer og mapper på Linux

Nu bruger vi dukommandoen til at se på filstørrelsen:

du geek.txt

Der står, at størrelsen er fire, men fire af hvad?

Der er blokke, og så er der blokke

Når du rapporterer filstørrelser i blokke, afhænger størrelsen, den bruger, af flere faktorer. Du kan angive, hvilken blokstørrelse den skal bruge på kommandolinjen. Hvis du ikke tvinger dutil at bruge en bestemt blokstørrelse, følger det et sæt regler for at bestemme, hvilken der skal bruges.

For det første kontrollerer den følgende miljøvariabler:

  • DU_BLOCK_SIZE
  • BLOCK_SIZE
  • BLOKSTØRRELSE

Hvis nogen af ​​disse findes, indstilles blokstørrelsen og dustopper med at kontrollere. Hvis ingen er indstillet, er  dustandardindstillingen en blokstørrelse på 1.024 bytes. Medmindre der er indstillet en miljøvariabel kaldet POSIXLY_CORRECT. Hvis det er tilfældet, er dustandardindstillingen en blokstørrelse på 512 byte.

Så hvordan finder vi ud af, hvilken der er i brug? Du kan kontrollere hver miljøvariabel for at finde ud af det, men der er en hurtigere måde. Lad os sammenligne resultaterne med den blokstørrelse, filsystemet bruger i stedet.

For at finde den blokstørrelse, filsystemet bruger, bruger vi tune2fsprogrammet. Vi bruger derefter indstillingen -l(liste superblok), rør output gennem grepog udskriver derefter linjer, der indeholder ordet "Bloker".

I dette eksempel ser vi på filsystemet på den første partition af den første harddisk sda1, og vi bliver nødt til at bruge sudo:

sudo tune2fs -l / dev / sda1 | grep Block

Filsystemets blokstørrelse er 4.096 bytes. Hvis vi deler det med det resultat, vi fik fra du (fire), viser det, at  du standardblokstørrelsen er 1.024 byte. Vi kender nu flere vigtige ting.

For det første ved vi, at den mindste mængde filsystemejendomme, der kan afsættes til lagring af en fil, er 4.096 bytes. Dette betyder, at selv vores lille to-byte-fil optager 4 KB plads på harddisken.

Den anden ting at huske på er applikationer dedikeret til rapportering om harddisk og filsystem statistik, såsom du, ls, og  tune2fskan have forskellige opfattelser af, hvad ”block” betyder. Den tune2fsansøgning rapporterer sande filsystemet blokstørrelser, mens  lsog dukan konfigureres eller tvunget til at bruge andre blokstørrelser. Disse blokstørrelser er ikke beregnet til at relateres til filsystemets blokstørrelse; de er bare "klumper", som disse kommandoer bruger i deres output.

Endelig, bortset fra at bruge forskellige blokstørrelser, svarene fra duog tune2fs formidle den samme betydning. Den tune2fsResultatet var en blok af 4.096 bytes, og duresultatet blev fire blokke af 1.024 bytes.

Ved brug af du

Uden kommandolinjeparametre eller indstillinger duviser den samlede diskplads, den aktuelle mappe og alle underkataloger bruger.

Lad os se på et eksempel:

du

Størrelsen rapporteres i standardblokstørrelsen på 1.024 bytes pr. Blok. Hele underkatalogstræet krydses.

Brug dui et andet katalog

Hvis du vil  du rapportere om en anden mappe end den nuværende, kan du sende stien til mappen på kommandolinjen:

du ~ / .cach / evolution /

Brug dui en bestemt fil

Hvis du vil  du rapportere om en bestemt fil, skal du sende stien til den pågældende fil på kommandolinjen. Du kan også videregive et skalmønster til en udvalgt gruppe af filer, såsom *.txt:

du ~ / .bash_aliases

Rapportering om filer i mapper

For at få durapporter om filerne i det aktuelle bibliotek og underkataloger skal du bruge indstillingen -a(alle filer):

du -a

For hver mappe rapporteres størrelsen på hver fil såvel som en total for hver mappe.

Begrænsende katalogtrædybde

Du kan fortælle duat liste katalogtræet til en bestemt dybde. For at gøre dette skal du bruge -d(maks. Dybde) og angive en dybdeværdi som parameter. Bemærk, at alle underkataloger scannes og bruges til at beregne de rapporterede totaler, men de er ikke alle anført. For at indstille en maksimal biblioteksdybde på et niveau skal du bruge denne kommando:

du-d 1

Outputtet viser den samlede størrelse for den underkatalog i den aktuelle mappe og giver også et samlet for hver enkelt.

For at liste mapper et niveau dybere skal du bruge denne kommando:

du-d 2

Indstilling af blokstørrelse

Du kan bruge blockindstillingen til at indstille en blokstørrelse til du for den aktuelle operation. For at bruge en blokstørrelse på en byte skal du bruge følgende kommando til at få de nøjagtige størrelser på mapper og filer:

du - blok = 1

Hvis du vil bruge en blokstørrelse på en megabyte, kan du bruge indstillingen -m(megabyte), som er den samme som --block=1M:

du -m

Hvis du vil have størrelserne rapporteret i den mest passende blokstørrelse i henhold til den diskplads, der bruges af mapper og filer, skal du bruge indstillingen -h(som kan læses af mennesker):

du -h

For at se den tilsyneladende størrelse af filen i stedet for mængden af ​​harddiskplads, der bruges til at gemme filen, skal du bruge --apparent-sizeindstillingen:

du --apparent-size

Du kan kombinere dette med indstillingen -a(alle) for at se den tilsyneladende størrelse på hver fil:

du --apparent-size -a

Hver fil er anført sammen med den tilsyneladende størrelse.

Viser kun totaler

Hvis du kun vil  du rapportere det samlede for biblioteket, skal du bruge indstillingen -s(opsummer). Du kan også kombinere dette med andre muligheder, såsom -h(menneskelig læsbar) mulighed:

du -h -s

Her bruger vi det med --apparent-sizemuligheden:

du --apparent-size -s

Viser ændringstider

Brug indstillingen for at se oprettelse eller sidste ændringstid og dato --time:

du --tid -d 2

Mærkelige resultater?

Hvis du ser mærkelige resultater fra du, især når du krydserfererer størrelser til output fra andre kommandoer, skyldes det normalt de forskellige blokstørrelser, som forskellige kommandoer kan indstilles til, eller de, som de standardiserer til. Det kan også skyldes forskellene mellem rigtige filstørrelser og den nødvendige diskplads til at gemme dem.

Hvis du har brug for at matche output fra andre kommandoer, skal du eksperimentere med --blockindstillingen i du.