Rekurzív könyvtárméret csak file-okra.

Sziasztok!

Tudtok-e valami egyszerű megoldást egy könyvtárban található file-ok (csak file-ok) méretének összegzésére rekurzívan.
A "du" beleszámolja az alkönyvtárak méretét is, még ha üres is. (kapcsolót nem találtam rá hogy csak a file-okat méretét számolja.)
Eddig "find"-el kértem le, és soronként adogattam össze, de ez nem túl szép, és erőforráskímélő...

Python vagy bash megoldás érdekelne főként.

A másik, ami kicsit kapcsolódik ide, hogy ha egy könyvtár mérete megnő a sok file miatt, a fileok törlése után is e méret látszik az idode-ban.

Lehet-e "resetelni" hogy a nálam szokásos 4096 byte legyen a mérete, ha már üres.
(Könyvtár töröl, létrehoz megoldás nem ér.)
Igazándiból valami defrag megoldás lenne jó, ami a fájlrendszer összes könyvtár méretét igazítja a tartalma méretéhez.

Hozzászólások

Mac os (tulképpen a BSD du-ja), de gondoltam a kapcsoló ugyanez Linux alatt is... Amúgy d, mint depth. Most megnéztem a linuxos du ugyanilyen értelmű kapcsolója a --max-depth=N, de így jobban megnézve, nem is ezt szeretnéd :) mert beleszámolja az alkönyvtárakat is (kicsit félreértettem a kérdést).
Szerintem ami neked kell, az kb ez lehet: du -hsS .

Ha bash-ban összeadogatni nem elég gyors (és nincs közvetlen parancs a dologra), miért nem írod meg C-ben?

Akarhogy is csinalod, vegig kell nyalaznod az osszes filet, es egyenkent osszeadogatni. Igy a findos megoldas akar jo is lehet, csak ugyesen kell csinalni, mondjuk valahogy igy:

(find $dir -type f | xargs stat -c '%s' | tr -d "\n"; echo 0) | bc -q

De lehet du-val is:

find $dir -type f | xargs du -bc

Elobbi azonban megbizhatobb, mert akkor is mukodik ha az xargs ugy dont, hogy hosszu a commandline es tobb reszletben futtatna.

"Elobbi azonban megbizhatobb, mert akkor is mukodik ha az xargs ugy dont, hogy hosszu a commandline es tobb reszletben futtatna."

Viszont a find tud úgy viselkedni, hogy nem kell hozzá stat - és a végén mégse lesz csövön cső a vége:


find -type f -ls | awk '{sum+=$7}; END { print sum}'

Akkor mar:


(find $dir -type f -printf "%s+"; echo 0) | bc -q

Nem kell awkval szorakozni, find is meg tudja formazni. Hatrany a subshell, de az meg mindig kevesebb szerintem mint egy awk. Mondjuk itt meg van bc, de akar azt is ki lehet loni:


expr $(find $dir -type f -printf "%s + 0")

Ennek mondjuk megint az a hibaja, hogy ha tul sok a file, tul hosszu lehet a commandline. Nem tudom, van-e ennek linuxon limitje, de ugy erzem a bc-s megoldas szebb :]

A másik, ami kicsit kapcsolódik ide, hogy ha egy könyvtár mérete megnő a sok file miatt, a fileok törlése után is e méret látszik az idode-ban.

Nem e méret "látszik", hanem az a könyvtár ennyi helyet foglal el fizikailag a diszken. És a du is azért számolja bele, mert az a könyvtár annyi helyet ténylegesen el is foglal.

Köszi a findes megoldásokat, biztos jobbak mint én csináltam pythonból a find eredményét soronként összeadva...

A könyvtárhoz visszatérve akkor ha jól látom a könyvtár inode egy olyan lemezterületre mutat ahol a könyvtárban tárolt fileok inode-jai vannak, ezért sok file esetén megnő a mérete.