Jak zjistit přesnou velikost sady souborů a složek

Jak zjistit přesnou velikost sady souborů a složek
« kdy: 17. 08. 2022, 08:58:54 »
Mám prostou otázku, kterou jsem ale nedokázal vyřešit. Nejsem s to dokopat linux, aby mi vyflusnul přesnou velikost všech souborů v určitém umístění. (tím myslím například/path/na/nějakou/složku)
Pokud se nepletu, tak chci znát přesnou délku souboru (apparent size), ne místo zabrané clustery na FS (což  bude asi nejbližší násobek 512/4096/etc). 

Jak jsem to zjistil? Kopíroval jsem adresářový strom z jednoho FS( ext4) na jiný (exfat). 

Zkoušel jsem pouze utilitu du. A Zkoušel jsem přepínače -S -s -c --aparent-size --block-size v různých kombinacích

Zlobí to, když zkoumaná adresářová struktura má podsložky, což je jaksi samozřejmost.


Například ls uvádí u složek na první partition velikost 131072 a u druhé 4096. Kvůli tomu jsme zkoušel parametr -S.

Příkaz du  ukazuje správně  na obou místech (umístění na exfat i na ext4), když vyberu nějakou složku, která už nemá podsložky a argument -B1 (zkratka pro --blocksize 1 a --apparent-size)

Jakým způsobem zjistit v linuxu velikost adresáře, který obsahuje další podsložky.. Chci udělat "bitové" srovnání, jestli velikost souborů (o obsahu nic nepíšu) souhlasí na bajt. Logicky složky v tomto srovnání se musí započítávat hodnotou nula.

« Poslední změna: 17. 08. 2022, 09:43:37 od Petr Krčmář »


Re:(du)Jak v linuxu zjistit přesnou velikost sady souborů a složek
« Odpověď #1 kdy: 17. 08. 2022, 09:14:26 »
Kód: [Vybrat]
du -bc
-b, --bytes
              equivalent to '--apparent-size --block-size=1'


Sice píšeš, že jsi "-aparent-size --block-size v různých kombinacích" zkoušel, ale u mne to s přepínačem -b dělá přesně to, co chceš.

Re:(du)Jak v linuxu zjistit přesnou velikost sady souborů a složek
« Odpověď #2 kdy: 17. 08. 2022, 09:15:08 »
Jeden inode, ktorý môže byť napr. len zoznam súborov (= adresár) zaberá 256 bytov ale ls ti napr. ukazuje 4096 link.

Ak chceš bytovo porovnať dva adresáre, tak si urob rekurzívny md5 sum.

Re:(du)Jak v linuxu zjistit přesnou velikost sady souborů a složek
« Odpověď #3 kdy: 17. 08. 2022, 09:34:53 »
Jestli dobře rozumím, chceš znát velikosti pouze souborů tak aby se ti do toho nepletly složky.
Takhle z hlavy bych použil find na typ soubor a pak exec nebo xargs s du nebo wc -c na jednotlivé soubory
 find . ! -type d
syntaxi  si najdi.

Návod jak linuxu zjistit přesnou velikost složky
« Odpověď #4 kdy: 17. 08. 2022, 09:38:27 »
Každopádně takto vyřešeno:
find "$a"  -type f -exec du  -b  {}   ";" |awk " {A=A+\$
1} END {print A}"


Mě to háže jiná čísla: na 100GB to udělá i 1MB. Kdybych s du -b neměl problém, tak bych se neptal... zkoušel jsi identický adresářový strom  (s zanořenými složkami) nakopírovat na jiný filesystém?  Jako když si dám du -ab tak to velikosti souborů souhlasí, ale kdo má porovnávat tisíce párů čísel, proto chci jen kouknout na součet.

Prostě dokud se do du nezamíchají vnořené složky je to OK, ale složky tam nesprávně přispívají různými velikostmi. A parametr -S to neřeší.


(jde mi o celkový součet velikostí. Správně byse měla porovnat každý pár velikosti, ale use case je jestli se zkopíroval adresář kompletní, tudíž na destination nemohou být velikosti nikdy větší a tím tedy i součet a stačí porovnat jen součet)
« Poslední změna: 17. 08. 2022, 09:41:09 od Ħαℓ₸℮ℵ ␏⫢ ⦚ »


Re:(du)Jak v linuxu zjistit přesnou velikost sady souborů a složek
« Odpověď #5 kdy: 17. 08. 2022, 09:50:20 »
Já to většinou sčítám takhle:
Kód: [Vybrat]
(find 'adresar' -type f -printf '%s+'; echo 0) | bc

Nebo pokud nemáš bc, tak to nasčítat rovnou v bashi, ale to může narazit na nějaké limity (můj bash má 64b aritmetiku, což většinou stačí, ale jinde to možná přeteče na 32b):

Kód: [Vybrat]
    echo $(( $(find 'adresar' -type f -printf '%s+'; echo 0) ))

Re:Návod jak linuxu zjistit přesnou velikost složky
« Odpověď #6 kdy: 17. 08. 2022, 09:57:25 »
Každopádně takto vyřešeno:
find "$a"  -type f -exec du  -b  {}   ";" |awk " {A=A+\$
1} END {print A}"


Mě to háže jiná čísla: na 100GB to udělá i 1MB. Kdybych s du -b neměl problém, tak bych se neptal... zkoušel jsi identický adresářový strom  (s zanořenými složkami) nakopírovat na jiný filesystém?  Jako když si dám du -ab tak to velikosti souborů souhlasí, ale kdo má porovnávat tisíce párů čísel, proto chci jen kouknout na součet.

Prostě dokud se do du nezamíchají vnořené složky je to OK, ale složky tam nesprávně přispívají různými velikostmi. A parametr -S to neřeší.


(jde mi o celkový součet velikostí. Správně byse měla porovnat každý pár velikosti, ale use case je jestli se zkopíroval adresář kompletní, tudíž na destination nemohou být velikosti nikdy větší a tím tedy i součet a stačí porovnat jen součet)
Už nic, kolega byl rychlejší

« Poslední změna: 17. 08. 2022, 10:02:22 od FKoudelka »

Re:Návod jak linuxu zjistit přesnou velikost složky
« Odpověď #7 kdy: 17. 08. 2022, 21:22:42 »
Prostě dokud se do du nezamíchají vnořené složky je to OK, ale složky tam nesprávně přispívají různými velikostmi.
Nikoli, složky tam správně přispívají svými velikostmi. Protože i to, že složka obsahuje soubory a další složky, musí být někde uloženo. A je to uloženo přesně na tom samém místě, kde má soubor uložena data souboru. Takže složky na linuxu opravdu mají svou velikost a du ji započítává.

Re:Návod jak linuxu zjistit přesnou velikost složky
« Odpověď #8 kdy: 17. 08. 2022, 22:13:52 »
Prostě dokud se do du nezamíchají vnořené složky je to OK, ale složky tam nesprávně přispívají různými velikostmi.
Nikoli, složky tam správně přispívají svými velikostmi. Protože i to, že složka obsahuje soubory a další složky, musí být někde uloženo. A je to uloženo přesně na tom samém místě, kde má soubor uložena data souboru. Takže složky na linuxu opravdu mají svou velikost a du ji započítává.
Jasně, pravdu máš, vyvracet ti ji nebudu. Ale pro můj use (součet délky souborů)  case naprosto nepoužitelné.

Díky ondrah za pěkný trik s -printf, možná to je i ve skutečnosti efektivnější , škáluje to lépe

_Jenda

  • *****
  • 1 550
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Jak zjistit přesnou velikost sady souborů a složek
« Odpověď #9 kdy: 18. 08. 2022, 00:17:35 »
A taky na sčítání čísel co mu napajpujete existuje program numsum z balíku num-utils.

Re:(du)Jak v linuxu zjistit přesnou velikost sady souborů a složek
« Odpověď #10 kdy: 18. 08. 2022, 10:13:41 »
-printf '%s+';
Hmm, ale tam kde to chci pouštět, find nezná parametr printf

Re:(du)Jak v linuxu zjistit přesnou velikost sady souborů a složek
« Odpověď #11 kdy: 18. 08. 2022, 16:38:55 »
-printf '%s+';
Hmm, ale tam kde to chci pouštět, find nezná parametr printf

To tam nejspíš nemáš normální GNU findutils, ale jen nějaký ořezaný busybox nebo něco takového, ne? V těchhle šizených prostředích bývá opruz řešit cokoli. Pokud se ti nechce s tím moc párat, zůstaň u té varianty s -exec du, ale samozřejmě to bude na větším množství souborů zoufale pomalé, protože pro každý soubor to spouští extra proces du. A spustit třeba stotisíckrát byť takhle lehoučký proces, to už chvíli trvá.
Možná ještě můžeš místo du zkusit stat -c '%s', jestli to třeba není rychlejší (pro jeden soubor to dělá prakticky to samé, jen na rozdíl od du vypíše jen velikost bez názvu souboru), ale osobně myslím, že to v nejlepším případě vyjde plus minus nastejno.

Pokud máš možnost nainstalovat find z těch GNU findutils, tak to vřele doporučuji. Je to běžná věc, tak by to snad nemusel být takový problém. Pokud tu možnost nemáš a potřebuješ velikosti počítat často, tak bych na tvém místě zvažoval spíš si napsat nějaký prográmek, který to pořeší. Samozřejmě pokud tam je k dispozici něco, v čem se to dá jednoduše napsat, třeba python nebo perl. Na vstupu může dostat seznam souborů z find, protože procházet adresářovou strukturu programově je zbytečná a otravná práce navíc, zavolat pro každý soubor ze seznamu stat() (jako funkce v tom jazyce to bude na rozdíl od command line utilit velmi rychlé, protože odpadá režie na spuštění dalšího procesu) a rovnou ty velikosti posčítat. Ve většině rozumných jazyků je to věc na pár řádků.