Není zde žádný problém s nepřesností nebo spolehlivostí, pouze porovnáváte dvě různá čísla:logickou velikost vs. fyzickou velikost.
Zde je ilustrace Wikipedie pro řídké soubory:
ls
zobrazuje šedé + zelené oblasti, logickou délku souboru. du
(bez --apparent-size
) zobrazuje pouze zelené plochy, protože právě ty zabírají místo.
Pomocí dd count=0 bs=1M seek=100 of=myfile
můžete vytvořit řídký soubor .
ls
ukazuje 100 MiB, protože tolik je soubor dlouhý:
$ ls -lh myfile
-rw-r----- 1 me me 100M Jul 15 10:57 myfile
du
ukazuje 0, protože je přiděleno tolik dat:
$ du myfile
0 myfile
ls -l --block-size=M
vám poskytne dlouhý výpis formátu (potřebný ke skutečnému zobrazení velikosti souboru) a zaokrouhlí velikosti souborů až na nejbližší MiB
.
Pokud chcete MB
(10^6 bajtů) místo MiB
(2^20 bajtů) jednotek, použijte --block-size=MB
místo toho.
Pokud nechcete M
příponu připojenou k velikosti souboru, můžete použít něco jako --block-size=1M
. Děkuji Stéphane Chazelas za to, že to navrhl.
Toto je popsáno v manuálové stránce ls
; man ls
a vyhledejte SIZE
. Umožňuje použití jiných jednotek než MB/MiB
také a podle vzhledu (to jsem nezkoušel) také libovolné velikosti bloků (takže můžete vidět velikost souboru jako počet 412bajtových bloků, pokud chcete).
Všimněte si, že --block-size
parametr je rozšíření GNU nad ls
otevřené skupiny , takže to nemusí fungovat, pokud nemáte uživatelskou zemi GNU (což má většina instalací Linuxu). ls z GNU coreutils 8.5 podporuje --block-size
jak je popsáno výše.
Existuje několik pojmů o velikosti souboru, jak je vysvětleno v odpovědi druhého muže a na obrázku wikipage o řídkých souborech.
Možná však budete chtít použít oba příkazy ls(1) a stat(1).
Pokud kódujete v C, zvažte použití systémových volání stat(2) &lseek(2).
Viz také odkazy v této odpovědi.