- Dave McKay
@TheGurkha
- den 19 December 2019, 8:00 EDT
När du använder Linux du
kommando, du kan få både den faktiska diskanvändning och den verkliga storleken på en fil eller katalog. Vi ska förklara varför dessa värden inte är desamma.
faktisk diskanvändning och sann storlek
storleken på en fil och det utrymme som den upptar på din hårddisk är sällan desamma., Diskutrymme tilldelas i block. Om en fil är mindre än ett block, är ett helt block fortfarande tilldelas det eftersom filsystemet inte har en mindre enhet av fastigheter att använda.
Om inte en fils storlek är en exakt multipel av block, måste det utrymme den använder på hårddisken alltid avrundas uppåt till nästa hela blocket. Till exempel, om en fil är större än två block men mindre än tre, tar det fortfarande tre block av utrymme för att lagra den.
två mätningar används i förhållande till Filstorlek., Den första är filens faktiska storlek, vilket är antalet byte av innehåll som utgör filen. Den andra är den effektiva storleken på filen på hårddisken. Detta är antalet filsystemblock som är nödvändiga för att lagra den filen.
ett exempel
låt oss titta på ett enkelt exempel., Vi omdirigerar ett enda tecken till en fil för att skapa en liten fil:
echo "1" > geek.txt
nu använder vi listan med långa format, ls
, för att titta på filens längd:
ls -l geek.txt
längden är det numeriska värdet som följer dave dave
poster, vilket är två byte. Varför är det två byte när vi bara skickade ett tecken till filen? Låt oss ta en titt på vad som händer i filen.,
vi använder kommandothexdump
, vilket ger oss en exakt byte och tillåter oss att ”se” icke-utskrift tecken som hexadecimala värden. Vi kommer också att använda alternativet -C
(canonical) för att tvinga utmatningen att visa hexadecimala värden i utmatningens kropp, liksom deras alfanumeriska teckenekvivalenter:
hexdump -C geek.txt
utmatningen visar oss att det, från och med offset 00000000 i filen, finns en byte som innehåller ett hexadecimalt värde på 31, och en som innehåller en hexadecimal värdet av 0A., Den högra delen av utmatningen visar dessa värden som alfanumeriska tecken, där så är möjligt.
det hexadecimala värdet på 31 används för att representera siffran ett. Det hexadecimala värdet för 0A används för att representera Linjekanalen, som inte kan visas som ett alfanumeriskt tecken, så det visas som en period (.) istället. Line Feed-tecknet läggs till av echo
. Som standard startar echo
en ny rad efter att den visar texten som den behöver skriva till terminalfönstret.,
det stämmer med utmatningen från ls
och överensstämmer med fillängden på två byte.
relaterat: hur man använder kommandot ls för att lista filer och kataloger på Linux
nu använder vi kommandot du
för att titta på filstorleken:
du geek.txt
det står att storleken är fyra, men fyra av vad?
det finns block, och sedan finns det Block
När du
rapporterar filstorlekar i block, storleken den använder beror på flera faktorer., Du kan ange vilken blockstorlek den ska använda på kommandoraden. Om du inte tvingar du
att använda en viss blockstorlek följer den en uppsättning regler för att bestämma vilken som ska användas.
först kontrollerar den följande miljövariabler:
- du_block_size
- BLOCK_SIZE
- BLOCKSIZE
om något av dessa finns är blockstorleken inställd och du
slutar kontrollera. Om ingen är inställd,du
standardvärden för en blockstorlek på 1 024 byte., Om inte en miljövariabel som heter POSIXLY_CORRECT
är inställd. Om så är fallet,du
standardvärden för ett blockstorlek på 512 byte.
Så, hur får vi reda på vilken som används? Du kan kontrollera varje miljövariabel för att räkna ut det, men det finns ett snabbare sätt. Låt oss jämföra resultaten med blockstorleken som filsystemet använder istället.
för att upptäcka blockstorleken som filsystemet använder, använder vi tune2fs
– programmet., Vi använder sedan alternativet -l
(list superblock), rör utmatningen genom grep
och skriv sedan ut rader som innehåller ordet ”Block.”
i det här exemplet tittar vi på filsystemet på den första partitionen på den första hårddisken,sda1
, och vi måste användasudo
:
sudo tune2fs -l /dev/sda1 | grep Block
filsystemblocksstorleken är 4 096 byte. Om vi delar upp det med resultatet vi fick fråndu
(fyra) visar detdu
standardblockstorleken är 1 024 byte., Vi vet nu flera viktiga saker.
först vet vi den minsta mängden filsystem fastigheter som kan ägnas åt att lagra en fil är 4,096 byte. Detta innebär att även vår lilla, två-byte fil tar upp 4 KB hårddiskutrymme.
det andra att komma ihåg är program som är avsedda för rapportering på hårddisk och filsystemsstatistik, till exempel du
, ls
och tune2fs
, kan ha olika uppfattningar om vad” block ” betyder., tune2fs
programmet rapporterar blockstorlekar för true file system, medan ls
ochdu
kan konfigureras eller tvingas använda andra blockstorlekar. Dessa blockstorlekar är inte avsedda att relatera till filsystemblocksstorleken; de är bara ”bitar” de kommandon som används i deras produktion.
slutligen, förutom att använda olika blockstorlekar, ger svaren från du
och tune2fs
samma innebörd., Resultatettune2fs
var ett block med 4 096 byte ,och resultatetdu
var fyra block med 1 024 byte.
använda du
utan kommandoradsparametrar eller alternativ,du
listar det totala diskutrymme som den aktuella katalogen och alla underkataloger använder.
låt oss ta en titt på ett exempel:
du
storleken rapporteras i standardblockstorleken på 1 024 byte per block. Hela underkatalog trädet korsas.,
använda du på en annan katalog
om du vill du
för att rapportera på en annan katalog än den nuvarande, kan du skicka sökvägen till katalogen på kommandoraden:
du ~/.cach/evolution/
använda du på en viss fil
om du vill du
för att rapportera om en viss fil, skicka sökvägen till den filen på kommandoraden., Du kan också skicka ett skalmönster till en Välj en grupp av filer, såsom *.txt
:
du ~/.bash_aliases
rapportering om filer i kataloger
att ha du
rapport om filerna i den aktuella katalogen och underkataloger, använd -a
(alla filer) alternativ:
du -a
för varje katalog rapporteras storleken på varje fil, liksom en summa för varje katalog.,
begränsa Katalogträdets djup
Du kan berätta fördu
att lista katalogträdet till ett visst djup. För att göra det, använd alternativet -d
(max djup) och ge ett djupvärde som parameter. Observera att alla underkataloger skannas och används för att beräkna de rapporterade totalsummorna, men de är inte alla listade. För att ställa in ett maximalt katalogdjup på en nivå, använd det här kommandot:
du -d 1
utmatningen listar den totala storleken på den underkatalogen i den aktuella katalogen och ger också totalt för var och en.,
för att lista kataloger en nivå djupare, använd det här kommandot:
du -d 2
ställa in blockstorleken
Du kan använda alternativetblock
för att ställa in en blockstorlek fördu
för den aktuella åtgärden.,d använd alternativet -h
(läsbar) i den mest lämpliga blockstorleken enligt det diskutrymme som används av kataloger och filer, använd alternativet-h
(läsbar):
du -h
för att se filens uppenbara storlek snarare än mängden hårddiskutrymme som används för att lagra filen, använd alternativet--apparent-size
:
du --apparent-size
Du kan kombinera detta med alternativet-a
(alla) för att se den synliga storleken på varje fil:
du --apparent-size -a
varje fil är listad, tillsammans med dess skenbara storlek.,
Visa endast totalsummor
om du vill attdu
bara ska rapportera totalsumman för katalogen använder du alternativet-s
(sammanfatta)., Du kan också kombinera detta med andra alternativ, till exempel alternativet -h
(läsbar):
du -h -s
här använder vi det med alternativet --apparent-size
:
du --apparent-size -s
visar Ändringstider
för att se skapa eller senaste ändring tid och datum, använd --time
alternativet:
du --time -d 2
konstiga resultat?,
om du ser konstiga resultat från du
, speciellt när du korsreferensstorlekar till utgången från andra kommandon, beror det oftast på de olika blockstorlekar som olika kommandon kan ställas in på eller de som de standard. Det kan också bero på skillnaderna mellan verkliga filstorlekar och diskutrymme som krävs för att lagra dem.
om du behöver matcha utdata från andra kommandon, experimentera med alternativet--block
Idu
.,
Dave McKay använde först datorer när stansade papperstejp var på modet, och han har programmerat sedan dess. Efter över 30 år i IT-branschen är han nu en heltidsjournalist inom teknik. Under sin karriär har han arbetat som frilansprogrammerare, chef för ett internationellt mjukvaruutvecklingsteam, en IT-tjänst projektledare och senast som dataskyddsansvarig. Dave är en Linux evangelist och öppen källkod förespråkare.Läs hela Bio ”