Nijak zásadní zrychlení ale aspoň něco :)
find . -printf \\n | wc -l
Opravdu nemusíte předávat seznam názvů souborů, stačí pouze nové řádky. Tato varianta je asi o 15 % rychlejší na mém Ubuntu 12.04.3, když jsou adresáře uloženy v paměti RAM. Navíc tato varianta bude správně fungovat s názvy souborů obsahujícími nové řádky.
Zajímavé je, že tato varianta se zdá být o něco pomalejší než ta výše:
find . -printf x | wc -c
Speciální případ – ale opravdu rychlý
Pokud je adresář na vlastním souborovém systému, můžete jednoduše spočítat inody:
df -i .
Pokud se počet adresářů a souborů v jiných než napočítaných adresářích příliš nemění, můžete tento známý počet jednoduše odečíst od aktuálního df -i
výsledek. Tímto způsobem budete moci spočítat soubory a adresáře velmi rychle.
Napsal jsem ffcnt přesně pro tento účel. Načte fyzický offset samotných adresářů pomocí fiemap
ioctl a pak naplánovat procházení adresáře ve více po sobě jdoucích průchodech, aby se omezil náhodný přístup. Zda skutečně dosáhnete zrychlení ve srovnání s find | wc
závisí na několika faktorech:
- typ souborového systému:souborové systémy jako ext4, které podporují
fiemap
ioctl bude mít největší užitek - Rychlost náhodného přístupu:HDD těží mnohem více než SSD
- Rozvržení adresářů:čím vyšší počet vnořených adresářů, tím větší potenciál optimalizace
(re)montáž pomocí relatime
nebo dokonce nodiratime
může také zvýšit rychlost (u všech metod), pokud by přístupy jinak způsobily aktualizace metadat.
Ve skutečnosti na mém systému (Arch Linux) tento příkaz
ls -A | wc -l
je rychlejší než všechny výše uvedené:
$ time find . | wc -l
1893
real 0m0.027s
user 0m0.004s
sys 0m0.004s
$ time find . -printf \\n | wc -l
1893
real 0m0.009s
user 0m0.000s
sys 0m0.008s
$ time find . -printf x | wc -c
1893
real 0m0.009s
user 0m0.000s
sys 0m0.008s
$ time ls -A | wc -l
1892
real 0m0.007s
user 0m0.000s
sys 0m0.004s