Jak získat velikost souboru nebo adresáře v systému Linux

Při použití dupříkazu Linux získáte skutečné využití disku a skutečnou velikost souboru nebo adresáře. Vysvětlíme, proč tyto hodnoty nejsou stejné.

Skutečné využití disku a skutečná velikost

Velikost souboru a místo, které zabírá na vašem pevném disku, jsou zřídka stejné. Místo na disku je přiděleno v blocích. Pokud je soubor menší než blok, je mu stále přidělen celý blok, protože souborový systém nemá k dispozici menší jednotku nemovitostí.

Pokud velikost souboru není přesným násobkem bloků, musí být místo, které používá na pevném disku, vždy zaokrouhleno nahoru na další celý blok. Například pokud je soubor větší než dva bloky, ale menší než tři, jeho uložení stále trvá tři bloky prostoru.

Ve vztahu k velikosti souboru se používají dvě měření. První je skutečná velikost souboru, což je počet bajtů obsahu, který tvoří soubor. Druhým je efektivní velikost souboru na pevném disku. Toto je počet bloků systému souborů nezbytných k uložení daného souboru.

Příklad

Podívejme se na jednoduchý příklad. Přesměrujeme jeden znak do souboru a vytvoříme malý soubor:

echo "1"> geek.txt

Nyní použijeme výpis dlouhého formátu  ls, abychom se podívali na délku souboru:

ls -l geek.txt

Délka je číselná hodnota, která následuje za dave dave  položkami, což jsou dva bajty. Proč jsou to dva bajty, když jsme do souboru odeslali pouze jeden znak? Pojďme se podívat na to, co se děje uvnitř souboru.

Použijeme hexdumppříkaz, který nám dá přesný počet bajtů a umožní nám „vidět“ netisknutelné znaky jako hexadecimální hodnoty. -CMožnost (kanonická) použijeme také k vynucení výstupu, aby zobrazoval hexadecimální hodnoty v těle výstupu, stejně jako jejich alfanumerické znakové ekvivalenty:

hexdump -C geek.txt

Výstup nám ukazuje, že počínaje offsetem 00000000 v souboru existuje bajt, který obsahuje hexadecimální hodnotu 31, a ten, který obsahuje hexadecimální hodnotu 0A. Pravá část výstupu zobrazuje tyto hodnoty jako alfanumerické znaky, kdykoli je to možné.

Hexadecimální hodnota 31 se používá k reprezentaci číslice jedna. Hexadecimální hodnota 0A se používá k reprezentaci znaku Line Feed, který nelze zobrazit jako alfanumerický znak, takže se místo toho zobrazuje jako tečka (.). Znak Line Feed je přidán uživatelem echo. Ve výchozím nastavení  echospustí nový řádek poté, co zobrazí text, který potřebuje k zápisu do okna terminálu.

To odpovídá výstupu z  ls a souhlasí s délkou souboru dvou bytů.

SOUVISEJÍCÍ: Jak používat příkaz ls k výpisu souborů a adresářů v systému Linux

Nyní se pomocí dupříkazu podíváme na velikost souboru:

du geek.txt

Říká, že velikost je čtyři, ale čtyři z čeho?

Existují bloky a pak existují bloky

Když du hlásí velikosti souborů v blocích, velikost, kterou používá, závisí na několika faktorech. Na příkazovém řádku můžete určit, jakou velikost bloku má použít. Pokud nevynucujete dupoužít konkrétní velikost bloku, řídí se sadou pravidel, která se rozhodnou použít.

Nejprve zkontroluje následující proměnné prostředí:

  • DU_BLOCK_SIZE
  • BLOCK_SIZE
  • BLOKOVAT VELIKOST

Pokud některý z těchto existuje, nastaví se velikost bloku a dupřestane se kontrolovat. Pokud není nastaven žádný,  dupoužije se výchozí velikost bloku 1024 bajtů. Pokud tedy není nastavena proměnná prostředí s názvem POSIXLY_CORRECT. V takovém případě je duvýchozí velikost bloku 512 bajtů.

Jak tedy zjistíme, který z nich se používá? Chcete-li to vyřešit, můžete zkontrolovat každou proměnnou prostředí, ale existuje rychlejší způsob. Porovnejme výsledky s velikostí bloku, který místo toho používá souborový systém.

Abychom zjistili velikost bloku, který systém souborů používá, použijeme tune2fsprogram. Potom použijeme možnost -l(seznam superbloků), prolistujeme výstup grepa poté vytiskneme řádky, které obsahují slovo „Blokovat“.

V tomto příkladu se podíváme na souborový systém na prvním oddílu prvního pevného disku sda1a budeme muset použít sudo:

sudo tune2fs -l / dev / sda1 | grep Blokovat

Velikost bloku systému souborů je 4 096 bajtů. Pokud to vydělíme výsledkem, který jsme dostali z du (čtyř), ukazuje to, že  du výchozí velikost bloku je 1024 bajtů. Nyní víme několik důležitých věcí.

Nejprve víme, že nejmenší množství nemovitostí souborového systému, které lze věnovat uložení souboru, je 4096 bajtů. To znamená, že i náš malý dvoubajtový soubor zabírá 4 kB místa na pevném disku.

Druhá věc, kterou byste měli mít na paměti, je aplikace určené pro podávání zpráv na pevném disku a souborový systém statistik, jako jsou du, lstune2fsmohou mít různé představy o tom, co „blok“ prostředky. tune2fsAplikace hlásí skutečné souborový systém velikosti bloků, přičemž  lsa dumůže být nakonfigurován tak, nebo nuceni používat jiné velikosti bloků. Tyto velikosti bloků nejsou zamýšleny tak, aby se vztahovaly k velikosti bloku souborového systému; jsou to jen „kousky“, které tyto příkazy používají ve svém výstupu.

A konečně, kromě použití různých velikostí bloků, odpovědi dua tune2fs vyjadřují stejný význam. tune2fsVýsledkem byl jeden blok 4096 bajtů, a duvýsledek byl čtyři bloky 1024 bajtů.

Použitím du

Bez parametrů nebo možností příkazového řádku duuvádí celkový prostor na disku, který aktuální adresář a všechny podadresáře používají.

Podívejme se na příklad:

du

Velikost se uvádí ve výchozí velikosti bloku 1024 bajtů na blok. Je procházen celý strom podadresářů.

Použití duv jiném adresáři

Pokud chcete  du hlásit v jiném adresáři, než je aktuální, můžete cestu k adresáři předat na příkazovém řádku:

du ~ / .cach / evolution /

Použití duna konkrétním souboru

Pokud chcete  du hlásit o konkrétním souboru, předejte cestu k tomuto souboru na příkazovém řádku. Vzor prostředí můžete také předat vybrané skupině souborů, například *.txt:

du ~ / .bash_aliases

Hlášení o souborech v adresářích

Chcete-li mít dupřehled o souborech v aktuálním adresáři a podadresářích, použijte možnost -a(všechny soubory):

du -a

U každého adresáře se uvádí velikost každého souboru a celková částka za každý adresář.

Omezení hloubky adresářového stromu

Můžete říci, duže máte seznam adresářových stromů do určité hloubky. Chcete-li tak učinit, použijte možnost -d(maximální hloubka) a zadejte hodnotu hloubky jako parametr. Všimněte si, že všechny podadresáře jsou skenovány a použity k výpočtu vykazovaných součtů, ale nejsou všechny uvedeny. Chcete-li nastavit maximální hloubku adresáře na jedné úrovni, použijte tento příkaz:

du -d 1

Výstup uvádí celkovou velikost daného podadresáře v aktuálním adresáři a také poskytuje součet pro každý z nich.

Chcete-li vypsat adresáře o jednu úroveň hlouběji, použijte tento příkaz:

du -d 2

Nastavení velikosti bloku

Tuto možnost můžete použít blockk nastavení velikosti bloku du pro aktuální operaci. Chcete-li použít velikost bloku jednoho bajtu, použijte následující příkaz k získání přesných velikostí adresářů a souborů:

du - blok = 1

Pokud chcete použít velikost bloku jednoho megabajtu, můžete použít možnost -m(megabajt), která je stejná jako --block=1M:

du-m

Pokud chcete, aby se velikosti uváděly v nejvhodnější velikosti bloku podle místa na disku použitém adresáři a soubory, použijte možnost -h(čitelné člověkem):

du-h

Chcete-li zobrazit zjevnou velikost souboru, nikoli velikost místa na pevném disku použitého k uložení souboru, použijte --apparent-sizemožnost:

du - zjevná velikost

Můžete to zkombinovat s možností -a(vše), abyste viděli zdánlivou velikost každého souboru:

du - zjevná velikost -a

Každý soubor je uveden v seznamu spolu s jeho zjevnou velikostí.

Zobrazují se pouze součty

Pokud chcete  du vykázat pouze součet za adresář, použijte možnost -s(shrnout). Můžete to také kombinovat s dalšími možnostmi, například s možností -h(čitelnou):

du -h -s

Zde jej použijeme s --apparent-sizemožností:

du - zjevná velikost

Zobrazení časů úprav

Chcete-li zobrazit čas a datum vytvoření nebo poslední úpravy, použijte --timemožnost:

du --time -d 2

Zvláštní výsledky?

Pokud vidíte podivné výsledky du, zvláště když porovnáváte velikosti odkazů na výstup z jiných příkazů, je to obvykle kvůli různým velikostem bloků, na které lze nastavit různé příkazy, nebo těm, pro které jsou výchozí. Může to být také kvůli rozdílům mezi skutečnými velikostmi souborů a prostorem na disku potřebným k jejich uložení.

Pokud potřebujete porovnat výstup ostatních příkazů, experimentujte s --blockmožností v du.