- Dave McKay
@TheGurkha
- 19 December 2019, 8:00 uur EDT
Wanneer u de Linux du
commando om zowel de feitelijke schijfgebruik en de ware grootte van een bestand of directory. We zullen uitleggen waarom deze waarden niet hetzelfde zijn.
feitelijk schijfgebruik en ware grootte
De grootte van een bestand en de ruimte die het inneemt op uw harde schijf zijn zelden hetzelfde., Schijfruimte wordt toegewezen in blokken. Als een bestand kleiner is dan een blok, wordt er nog steeds een heel blok aan toegewezen omdat het bestandssysteem geen kleinere eenheid Vastgoed heeft om te gebruiken.
tenzij de grootte van een bestand een exact veelvoud van blokken is, moet de ruimte die het gebruikt op de harde schijf altijd naar boven worden afgerond naar het volgende hele blok. Bijvoorbeeld, als een bestand groter is dan twee blokken maar kleiner dan drie, duurt het nog steeds drie blokken ruimte om het op te slaan.
twee metingen worden gebruikt in relatie tot de bestandsgrootte., De eerste is de werkelijke grootte van het bestand, dat is het aantal bytes van de inhoud die deel uitmaken van het bestand. 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 eens kijken naar een eenvoudig voorbeeld., We zullen een enkel teken omleiden naar een bestand om een klein bestand aan te maken:
echo "1" > geek.txt
nu zullen we de lange lijst gebruiken, ls
, om te kijken naar de lengte van het bestand:
ls -l geek.txt
De lengte is de numerieke waarde die volgt op de dave dave
entries, dat is twee bytes. Waarom zijn het twee bytes als we maar één karakter naar het bestand sturen? Laten we eens kijken wat er in het dossier gebeurt.,
we gebruiken het hexdump
commando, dat ons een exacte byte telling geeft en ons toestaat om niet-afdrukbare tekens Als hexadecimale waarden te” zien”. We zullen ook gebruik maken van de -C
(canonieke) optie om de uitvoer aan te tonen hexadecimale waarden in het lichaam van de output, evenals hun alfanumeriek teken equivalenten:
hexdump -C geek.txt
De uitvoer toont ons dat, begin bij offset 00000000 in de file, er is een byte die de hexadecimale waarde van 31, en één die de hexadecimale waarde van 0A., Het rechtergedeelte van de uitvoer toont deze waarden waar mogelijk als alfanumerieke tekens.
de hexadecimale waarde van 31 wordt gebruikt om het cijfer 1 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, dus het wordt weergegeven als een periode (.) daarvan. Het line Feed-teken wordt toegevoegd door echo
. Standaard start echo
een nieuwe regel nadat deze de tekst weergeeft die het nodig heeft om naar het terminalvenster te schrijven.,
die overeenkomt met de uitvoer van ls
en komt overeen met de bestandslengte van twee bytes.
gerelateerd: hoe het ls Commando te gebruiken om bestanden en mappen op Linux weer te geven
nu gebruiken we het du
commando om naar de bestandsgrootte te kijken:
du geek.txt
Het zegt dat de grootte vier is, maar vier van wat?
er zijn blokken, en dan zijn er blokken
wanneer du
bestandsgroottes in blokken rapporteert, hangt de grootte ervan af van verschillende factoren., U kunt opgeven welke blokgrootte het moet gebruiken op de opdrachtregel. Als u du
niet forceert om een bepaalde blokgrootte te gebruiken, volgt een set regels om te beslissen welke te gebruiken.
eerst controleert het de volgende omgevingsvariabelen:
- DU_BLOCK_SIZE
- BLOCK_SIZE
- BLOCKSIZE
als een van deze bestaat, wordt de blokgrootte ingesteld en du
stopt met controleren. Als er geen zijn ingesteld, heeft du
standaard een blokgrootte van 1.024 bytes., Tenzij, dat wil zeggen, een omgevingsvariabele genaamd POSIXLY_CORRECT
is ingesteld. Als dat het geval is, heeft du
standaard een blokgrootte van 512 bytes.
dus, hoe komen we erachter welke in gebruik is? U kunt elke omgevingsvariabele controleren om het uit te werken, maar er is een snellere manier. Laten we in plaats daarvan de resultaten vergelijken met de blokgrootte die het bestandssysteem gebruikt.
om de blokgrootte te ontdekken die het bestandssysteem gebruikt, gebruiken we het tune2fs
programma., We zullen dan de -l
(list superblock) optie gebruiken, de uitvoer doorsluizen naar grep
, en dan regels afdrukken die het woord “Block bevatten.”
In dit voorbeeld zullen we kijken naar het bestandssysteem op de eerste partitie van de eerste harde schijf, sda1
, en we moeten sudo
gebruiken:
sudo tune2fs -l /dev/sda1 | grep Block
De grootte van het bestandssysteem is 4.096 bytes. Als we dat delen door het resultaat dat we kregen van du
(vier), toont het de du
standaard blokgrootte is 1.024 bytes., We weten nu een aantal belangrijke dingen.
Ten eerste weten we dat de kleinste hoeveelheid vastgoed van het bestandssysteem die kan worden besteed aan het opslaan van een bestand 4.096 bytes is. Dit betekent dat zelfs onze kleine, twee-byte bestand neemt 4 KB van de harde schijf ruimte.
het tweede ding om in gedachten te houden is toepassingen gewijd aan het rapporteren over harde schijf en bestandssysteem statistieken, zoals du
, ls
, en tune2fs
, kunnen verschillende noties hebben van wat “block” betekent., De toepassing tune2fs
rapporteert echte blokgroottes voor bestandssystemen, terwijl ls
en du
geconfigureerd of gedwongen kan worden andere blokgroottes te gebruiken. Deze blokgroottes zijn niet bedoeld om te relateren aan de blokgrootte van het bestandssysteem; ze zijn gewoon “brokken” die commando ‘ s gebruiken in hun uitvoer.
ten slotte geven de antwoorden vandu
entune2fs
dezelfde betekenis., Het tune2fs
resultaat was één blok van 4.096 bytes, en het du
resultaat was vier blokken van 1.024 bytes.
met du
zonder commandoregelparameters 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 1.024 bytes per blok. De hele subdirectory boom wordt doorkruist.,
du gebruiken op een andere map
als u wilt dat du
rapporteert op een andere map dan de huidige, kunt u het pad naar de map doorgeven op de opdrachtregel:
du ~/.cach/evolution/
du gebruiken op een specifiek bestand
als u Als u een specifiek bestand wilt rapporteren, geeft u het pad naar dat bestand door op de commandoregel., U kunt ook langs een shell patroon voor een selecte groep van bestanden, zoals *.txt
:
du ~/.bash_aliases
de Rapportage over de Bestanden in de Directories
Om du
verslag van de bestanden in de huidige map en sub-mappen gebruik de -a
(alle bestanden) optie:
du -a
Voor elke map, de grootte van elk bestand wordt gerapporteerd, evenals in totaal voor elke map.,
Mapboomdiepte beperken
u kunt du
vertellen om de mapboom tot een bepaalde diepte te tonen. Gebruik hiervoor de optie -d
(max depth) en geef een dieptewaarde als parameter. Merk op dat alle submappen worden gescand en gebruikt om de gerapporteerde totalen te berekenen, maar ze zijn niet allemaal vermeld. Om een maximale mapdiepte van één niveau in te stellen, gebruik je het volgende commando:
du -d 1
De uitvoer toont de totale grootte van die submap in de huidige map en geeft ook een totaal voor elke map.,
om mappen een niveau dieper te tonen, gebruik je dit commando:
du -d 2
het instellen van de blokgrootte
u kunt de block
optie gebruiken om een blokgrootte in te stellen voor du
voor de huidige operatie.,d in de meest geschikte grootte van het blok volgens de schijf ruimte gebruikt door de mappen en bestanden, het gebruik van de -h
(human-readable) optie:
du -h
Om de schijnbare grootte van het bestand in plaats van de hoeveelheid ruimte op de harde schijf gebruikt voor het opslaan van het bestand, gebruik je de --apparent-size
optie:
du --apparent-size
U kunt dit combineren met de -a
(alle) mogelijkheid om de schijnbare grootte van elk bestand:
du --apparent-size -a
Elk bestand wordt vermeld, samen met de schijnbare grootte.,
alleen totalen weergeven
als u wilt du
om alleen het totaal voor de map te rapporteren, gebruikt u de optie -s
(summarize)., Ook kunt u dit combineren met andere opties, zoals de -h
(human-readable) optie:
du -h -s
Hier gebruiken we het met de --apparent-size
optie:
du --apparent-size -s
het Weergeven van Wijziging Keer
Om de schepping of van de laatste wijziging van datum en tijd, gebruik de --time
optie:
du --time -d 2
Vreemde Resultaten?,
als je vreemde resultaten ziet van du
, vooral als je groottes kruist naar de uitvoer van andere commando ‘s, dan is dat meestal te wijten aan de verschillende blokgroottes waarop verschillende commando’ s kunnen worden ingesteld of aan die waarop ze standaard staan. Het kan ook te wijten zijn aan de verschillen tussen echte bestandsgroottes en de benodigde schijfruimte om ze op te slaan.
Als u de uitvoer van andere commando ‘ s wilt matchen, experimenteer dan met de optie --block
In du
.,