Вы должны использовать «getdents» вместо ls / find
Вот одна очень хорошая статья, в которой описан подход getdents.
http://be -n.com / SPW / что Вы можете список на миллион-файлов-в-каталог-но-не-с-ls.html
Вот выдержка:
ls и практически любой другой способ перечисления каталога (включая python os.listdir, find.) Полагаются на libc readdir (). Однако readdir () считывает только 32 КБ записей каталога за раз, что означает, что если у вас много файлов в одном каталоге (то есть, 500 М записей каталога), то для чтения всех записей каталога потребуется безумно много времени. особенно на медленном диске. Для каталогов, содержащих большое количество файлов, вам нужно копать глубже, чем инструменты, основанные на readdir (). Вам нужно будет использовать системный вызов getdents () напрямую, а не вспомогательные методы из libc.
Мы можем найти код C для вывода списка файлов, используя getdents () из здесь :
Вам необходимо выполнить две модификации, чтобы быстро вывести список всех файлов в каталоге.
Сначала увеличьте размер буфера с X до 5 мегабайт.
#define BUF_SIZE 1024if (dp->d_ino != 0) printf(...);
5
Затем измените основной цикл, где он печатает информацию о каждом файле в каталоге, чтобы пропустить записи с inode == 0. Я сделал это, добавив
*1024*
В моем случае я действительно заботился только об именах файлов в каталоге, поэтому я также переписал оператор printf (), чтобы вывести только имя файла.
if(d->d_ino) printf("%sn ", (char *) d->d_name);
Скомпилируйте его (для этого не нужны никакие внешние библиотеки, так что это очень просто сделать)
gcc listdir.c -o listdir
Теперь просто запустите
./listdir [directory with insane number of files]