Jak získat velikost souboru nebo adresáře v Linuxu

Při použití příkazu du v Linuxu získáte informace o skutečném využití disku a o reálné velikosti souboru či adresáře. V tomto článku si objasníme, proč se tyto hodnoty mohou lišit.

Skutečná velikost versus využití disku

Velikost souboru a prostor, který fyzicky zabírá na pevném disku, se obvykle neshodují. Diskový prostor je přidělován v blocích. Pokud je soubor menší než jeden blok, i tak je mu přidělen celý blok, protože systém souborů nepracuje s menšími jednotkami. Jinými slovy, minimální jednotka pro alokaci diskového prostoru je jeden blok.

Jestliže velikost souboru není přesným násobkem velikosti bloku, prostor, který soubor zabírá na disku, se vždy zaokrouhlí nahoru na nejbližší vyšší celý blok. Například pokud má soubor velikost větší než dva bloky, ale menší než tři, k jeho uložení budou i tak potřeba tři bloky.

V souvislosti s velikostí souboru rozlišujeme dvě měření. První z nich je skutečná velikost souboru, která udává počet bajtů tvořících obsah souboru. Druhým měřením je efektivní velikost souboru na pevném disku, což představuje počet bloků souborového systému nezbytných k uložení daného souboru.

Praktický příklad

Podívejme se na jednoduchý příklad. Do souboru přesměrujeme jeden znak, čímž vytvoříme malý soubor:

echo "1" > geek.txt

Nyní použijeme příkaz ls s přepínačem -l (dlouhý formát), abychom zjistili velikost souboru:

ls -l geek.txt

Zobrazená délka souboru je 2 bajty (číselná hodnota následuje po položkách dave dave). Jak je možné, že soubor má dva bajty, když jsme do něj uložili pouze jeden znak? Podívejme se, co se odehrává uvnitř souboru.

Použijeme příkaz hexdump, který nám ukáže přesný počet bajtů a umožní nám „vidět“ netisknutelné znaky jako hexadecimální hodnoty. Navíc použijeme přepínač -C (kanonický), abychom donutili výstup zobrazit hexadecimální hodnoty i s jejich ASCII reprezentací:

hexdump -C geek.txt

Výstup bude vypadat přibližně takto:

00000000  31 0a                                             |1.|
00000002

První sloupec ukazuje offset (posun) v bajtech od začátku souboru. Druhý sloupec zobrazuje hexadecimální reprezentaci obsahu souboru, kde 31 odpovídá ASCII kódu znaku „1“ a 0a reprezentuje znak nového řádku (Line Feed), který je automaticky přidáván příkazem echo. Poslední sloupec udává textovou reprezentaci (pokud existuje) odpovídajících ASCII znaků.

Jak vidíme, soubor skutečně obsahuje dva bajty. První bajt je náš zadaný znak, a druhý bajt je znak konce řádku. Celkově má soubor velikost dvou bajtů, a tedy, ačkoliv obsahoval pouze jedno písmeno, zabírá na disku alespoň jeden blok.