Die Antwort ist nicht so einfach wie die Wahl des Dateisystems. Vernünftige Dateisysteme verwenden vor langer Zeit keine linearen Listen mehr für Verzeichnisse, was bedeutet, dass die Anzahl der Einträge in einem Verzeichnis keinen Einfluss auf die Dateizugriffszeit hat.
außer wenn es so ist.
Tatsächlich bleibt jede Operation schnell und effizient, unabhängig von der Anzahl der Einträge. Einige Aufgaben erfordern jedoch eine wachsende Anzahl von Operationen. Offensichtlich ls
dauert das Ausführen eines einfachen Vorgangs lange, und Sie sehen nichts, bis alle Inodes gelesen und sortiert wurden. Tun ls -U
(unsortiert) hilft ein wenig, weil Sie sehen können, dass es nicht tot ist, aber die Zeit nicht wahrnehmbar verkürzt. Weniger offensichtlich ist, dass jede Wildcard-Erweiterung jeden Dateinamen überprüfen muss, und es scheint, dass in den meisten Fällen auch der gesamte Inode gelesen werden muss.
Kurz gesagt: Wenn Sie sicher sein können, dass keine Anwendung (einschließlich Shell-Zugriff) jemals einen Wildard verwenden wird, können Sie riesige Verzeichnisse ohne Reue erhalten. Wenn jedoch einige Platzhalter im Code lauern, sollten Sie die Verzeichnisse besser unter jeweils tausend Einträgen halten.
bearbeiten :
Alle modernen Dateisysteme verwenden gute Datenstrukturen für große Verzeichnisse, sodass eine einzelne Operation, die den Inode einer bestimmten Datei finden muss, selbst in riesigen Verzeichnissen recht schnell ist.
Die meisten Anwendungen führen jedoch nicht nur Einzeloperationen aus. Die meisten von ihnen führen entweder ein vollständiges Verzeichnis oder einen Platzhalterabgleich durch. Diese sind auf jeden Fall langsam, da alle Einträge gelesen werden müssen.
Beispiel: Nehmen wir an, Sie haben ein Verzeichnis mit einer Million Dateien mit den Namen 'foo-000000.txt' bis 'foo-999999.txt' und eine einzige 'natalieportman.jpeg'. Diese werden schnell sein:
ls -l foo-123456.txt
open "foo-123456.txt"
delete "foo-123456.txt"
create "bar-000000.txt"
open "natalieportman.jpeg"
create "big_report.pdf"
diese werden scheitern, aber auch schnell scheitern:
ls -l bar-654321.txt
open bar-654321.txt
delete bar-654321.txt
Diese werden langsam sein, selbst wenn sie nur sehr wenige Ergebnisse liefern. Selbst diejenigen, die fehlschlagen, schlagen fehl, nachdem alle Einträge gescannt wurden:
ls
ls foo-1234*.txt
delete *.jpeg
move natalie* /home/emptydir/
move *.tiff /home/seriousphotos/
homes/u/username, homes/j/joeblow,homes/s/somebody,...
?