GNU/Linux >> Znalost Linux >  >> Linux

Existuje něco rychlejšího než `najít . | wc -l` pro počítání souborů v adresáři?

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

Linux
  1. Jak získat počet souborů v adresáři pomocí příkazového řádku?

  2. Cat soubory s adresářem?

  3. Přejmenovat soubory v adresáři?

  1. Jak spočítat počet souborů v adresáři a odstranit nejstarší, pokud počet překročí 5?

  2. Jak spočítat počet souborů v každém adresáři?

  3. rsync N nejnovějších souborů v adresáři

  1. Proč má nový adresář počet pevných odkazů 2, než se do něj něco přidá?

  2. Mazání souborů podle věku?

  3. Jaký je nejlepší způsob, jak spočítat počet souborů v adresáři?