Als u de Linux du
commando, verkrijgt u zowel het werkelijke schijfgebruik als de ware grootte van een bestand of directory. We leggen uit waarom deze waarden niet hetzelfde zijn.
Werkelijk schijfgebruik en ware grootte
De grootte van een bestand en de ruimte die het op uw harde schijf inneemt, zijn zelden hetzelfde. Schijfruimte wordt in blokken toegewezen. Als een bestand kleiner is dan een blok, wordt er nog steeds een heel blok aan toegewezen omdat het bestandssysteem geen kleinere eenheid onroerend goed heeft om te gebruiken.
Tenzij de grootte van een bestand een exact veelvoud van blokken is, moet de ruimte die het op de harde schijf gebruikt altijd naar boven worden afgerond naar het volgende hele blok. Als een bestand bijvoorbeeld groter is dan twee blokken maar kleiner dan drie, heeft het nog steeds drie blokken ruimte nodig om het op te slaan.
Er worden twee metingen gebruikt in relatie tot de bestandsgrootte. De eerste is de werkelijke grootte van het bestand, het aantal bytes aan inhoud waaruit het bestand bestaat. De tweede is de effectieve grootte van het bestand op de harde schijf. Dit is het aantal bestandssysteemblokken dat nodig is om dat bestand op te slaan.
Een voorbeeld
Laten we naar een eenvoudig voorbeeld kijken. We zullen een enkel teken omleiden naar een bestand om een klein bestand te maken:
echo "1" > geek.txt
De lengte is de numerieke waarde die volgt op de dave dave
ingangen, wat twee bytes is. Waarom zijn het twee bytes als we maar één teken naar het bestand hebben gestuurd? Laten we eens kijken wat er in het bestand gebeurt.
We gebruiken de hexdump
commando, dat ons een exact aantal bytes geeft en ons in staat stelt om niet-afdrukbare tekens als hexadecimale waarden te “zien”. We gebruiken ook de -C
(canonieke) optie om de uitvoer te dwingen hexadecimale waarden weer te geven in de hoofdtekst van de uitvoer, evenals hun alfanumerieke tekenequivalenten:
hexdump -C geek.txt
De uitvoer laat ons zien dat, beginnend bij offset 00000000 in het bestand, er een byte is met een hexadecimale waarde van 31, en een met een hexadecimale waarde van 0A. Het rechtergedeelte van de uitvoer geeft deze waarden waar mogelijk weer als alfanumerieke tekens.
De hexadecimale waarde van 31 wordt gebruikt om het cijfer één weer te geven. De hexadecimale waarde van 0A wordt gebruikt om het Line Feed-teken weer te geven, dat niet kan worden weergegeven als een alfanumeriek teken, maar wordt in plaats daarvan als een punt (.) Weergegeven. Het Line Feed-teken wordt toegevoegd door echo
. Standaard, echo
begint een nieuwe regel nadat het de tekst weergeeft die nodig is om naar het terminalvenster te schrijven.
Dat komt overeen met de output van ls
en gaat akkoord met de bestandslengte van twee bytes.
VERWANT: Hoe de ls-opdracht te gebruiken om bestanden en mappen op Linux weer te geven
Nu zullen we de du
commando om naar de bestandsgrootte te kijken:
du geek.txt
Er staat dat de maat vier is, maar waarvan vier?
Er zijn blokken en dan zijn er blokken
Wanneer du
rapporteert bestandsgroottes in blokken, de gebruikte grootte is afhankelijk van verschillende factoren. U kunt op de opdrachtregel specificeren welke blokgrootte het moet gebruiken. Als je niet forceert du
om een bepaalde blokgrootte te gebruiken, volgt het een reeks regels om te beslissen welke moet worden gebruikt.
Ten eerste controleert het de volgende omgevingsvariabelen:
- DU_BLOCK_SIZE
- BLOCK_SIZE
- BLOKGROOTTE
Als een van deze bestaat, wordt de blokgrootte ingesteld, en du
stopt met controleren. Als er geen zijn ingesteld, du
standaard ingesteld op een blokgrootte van 1024 bytes. Tenzij, dat wil zeggen, een omgevingsvariabele genaamd POSIXLY_CORRECT
is ingesteld. Als dat het geval is, du
standaard ingesteld op een blokgrootte van 512 bytes.
Dus, hoe kunnen we erachter komen welke in gebruik is? U kunt elke omgevingsvariabele controleren om erachter te komen, maar er is een snellere manier. Laten we de resultaten vergelijken met de blokgrootte die het bestandssysteem in plaats daarvan gebruikt.
Om de blokgrootte te ontdekken die het bestandssysteem gebruikt, gebruiken we de tune2fs
programma. We gebruiken dan de -l
(lijst superblok) optie, leid de uitvoer door grep
en druk vervolgens regels af die het woord ‘Block’ bevatten.
In dit voorbeeld kijken we naar het bestandssysteem op de eerste partitie van de eerste harde schijf, sda1
, en we zullen moeten gebruiken sudo
:
sudo tune2fs -l /dev/sda1 | grep Block
De blokgrootte van het bestandssysteem is 4.096 bytes. Als we dat delen door het resultaat dat we hebben gekregen du
(vier), het toont de du
standaard blokgrootte is 1024 bytes. We weten nu een aantal belangrijke dingen.
Ten eerste weten we dat de kleinste hoeveelheid bestandssysteemvastgoed dat kan worden besteed aan het opslaan van een bestand 4.096 bytes is. Dit betekent dat zelfs ons kleine bestand van twee bytes 4 KB ruimte op de harde schijf in beslag neemt.
Het tweede dat u in gedachten moet houden, zijn toepassingen die zijn bedoeld voor rapportage over statistieken van de harde schijf en bestandssysteem, zoals du
, ls
, en tune2fs
, kunnen verschillende opvattingen hebben over wat “blokkeren” betekent. De tune2fs
applicatie rapporteert echte blokgroottes van het bestandssysteem, terwijl ls
en du
kan worden geconfigureerd of gedwongen om andere blokgroottes te gebruiken. Die blokgroottes zijn niet bedoeld om te relateren aan de blokgrootte van het bestandssysteem; het zijn gewoon “brokken” die deze commando’s gebruiken in hun uitvoer.
Ten slotte, behalve het gebruik van verschillende blokgroottes, zijn de antwoorden van du
en tune2fs
brengen dezelfde betekenis over. De tune2fs
resultaat was een blok van 4.096 bytes, en de du
resultaat was vier blokken van 1024 bytes.
Gebruik makend van du
Zonder opdrachtregelparameters of opties, du
geeft de totale schijfruimte weer die de huidige map en alle submappen gebruiken.
Laten we een voorbeeld bekijken:
du
De grootte wordt gerapporteerd in de standaard blokgrootte van 1024 bytes per blok. De volledige submapboom wordt doorlopen.
Gebruik makend van du
op een andere directory
Als je wil du
om te rapporteren over een andere map dan de huidige, kunt u het pad naar de map op de opdrachtregel doorgeven:
du ~/.cach/evolution/
Gebruik makend van du
op een specifiek bestand
Als je wil du
om over een specifiek bestand te rapporteren, geeft u het pad naar dat bestand op de opdrachtregel door. U kunt ook een shell-patroon doorgeven aan een geselecteerde groep bestanden, zoals *.txt
:
du ~/.bash_aliases
Rapporteren over bestanden in telefoonboeken
Hebben du
rapport over de bestanden in de huidige map en submappen, gebruik de -a
(alle bestanden) optie:
du -a
Voor elke map wordt de grootte van elk bestand gerapporteerd, evenals een totaal voor elke map.
De diepte van de directorystructuur beperken
Je kunt het zien du
om de directorystructuur tot een bepaalde diepte weer te geven. Gebruik hiervoor de -d
(max diepte) optie en geef een dieptewaarde op als parameter. Merk op dat alle submappen worden gescand en gebruikt om de gerapporteerde totalen te berekenen, maar ze worden niet allemaal vermeld. Gebruik deze opdracht om een maximale mapdiepte van één niveau in te stellen:
du -d 1
De uitvoer toont de totale grootte van die submap in de huidige map en geeft ook een totaal voor elke map.
Gebruik deze opdracht om mappen een niveau dieper weer te geven:
du -d 2
De blokgrootte instellen
U kunt de block
optie om een blokgrootte in te stellen voor du
voor de huidige bewerking. Om een blokgrootte van één byte te gebruiken, gebruikt u de volgende opdracht om de exacte grootte van de mappen en bestanden te krijgen:
du --block=1
Als u een blokgrootte van één megabyte wilt gebruiken, kunt u de -m
(megabyte) optie, die hetzelfde is als --block=1M
:
du -m
Als u de grootten wilt die worden vermeld in de meest geschikte blokgrootte volgens de schijfruimte die wordt gebruikt door de mappen en bestanden, gebruikt u de -h
(door mensen leesbare) optie:
du -h
Om de schijnbare grootte van het bestand te zien in plaats van de hoeveelheid ruimte op de harde schijf die wordt gebruikt om het bestand op te slaan, gebruikt u de --apparent-size
optie:
du --apparent-size
U kunt dit combineren met de -a
(alles) optie om de schijnbare grootte van elk bestand te zien:
du --apparent-size -a
Elk bestand wordt vermeld, samen met de schijnbare grootte.
Alleen totalen weergeven
Als je wil du
om alleen het totaal voor de directory te rapporteren, gebruikt u de -s
(vat samen) optie. U kunt dit ook combineren met andere opties, zoals de -h
(door mensen leesbare) optie:
du -h -s
Hier gebruiken we het met de --apparent-size
optie:
du --apparent-size -s
Wijzigingstijden weergeven
Om de tijd en datum van de aanmaak of laatste wijziging te zien, gebruikt u de --time
optie:
du --time -d 2
Vreemde resultaten?
Als je vreemde resultaten ziet van du
, vooral als je een kruisverwijzing maakt naar de uitvoer van andere commando’s, is dit meestal te wijten aan de verschillende blokgroottes waarop verschillende commando’s kunnen worden ingesteld of die waarvoor ze standaard zijn. Het kan ook te wijten zijn aan de verschillen tussen de werkelijke bestandsgroottes en de schijfruimte die nodig is om ze op te slaan.
Als u de uitvoer van andere opdrachten wilt matchen, experimenteer dan met de --block
optie in du
.