Подтвердить что ты не робот

Максимальное количество индексов в каталоге?

Существует ли максимальное количество inodes в одном каталоге?

У меня есть каталог из более чем 2 миллионов файлов и не могу заставить команду ls работать с этим каталогом. Итак, теперь мне интересно, превысил ли я лимит на inodes в Linux. Существует ли предел до численного предела 2 ^ 64?

4b9b3361

Ответ 1

df -i должен указать вам количество используемых и доступных inodes файловой системы inodes.

Ответ 2

Попробуйте ls -U или ls -f.

ls, по умолчанию сортирует файлы по алфавиту. Если у вас 2 миллиона файлов, этот вид может занять много времени. Если ls -U (или, возможно, ls -f), имена файлов будут немедленно распечатаны.

Ответ 3

Нет. Пределы Inode относятся к каждой файловой системе и решаются на момент создания файловой системы. Вы могли бы нанести другой лимит, или, может быть, "ls" просто не справляется с этим.

Попробуйте следующее:

tune2fs -l /dev/DEVICE | grep -i inode

Он должен рассказать вам все виды информации, связанной с inode.

Ответ 5

Максимальный размер каталога зависит от файловой системы, и, следовательно, точный предел изменяется. Однако наличие очень больших каталогов - это плохая практика.

Вам следует подумать о том, чтобы ваши каталоги были меньше, сортируя файлы в подкаталоги. Одной из общих схем является использование первых двух символов для поддиректории первого уровня, как показано ниже:

${topdir}/aa/aardvark
${topdir}/ai/airplane

Это особенно хорошо работает при использовании UUID, GUID или хэш-значений содержимого для именования.

Ответ 6

Как заметил Роб Адамс, ls сортирует файлы перед их отображением. Обратите внимание: если вы используете NFS, сервер NFS будет сортировать каталог перед его отправкой, а 2 миллиона записей могут занимать больше времени, чем таймаут NFS. Это делает каталог незарегистрированным через NFS, даже с флагом -f.

Это может быть справедливо и для других сетевых файловых систем.

Пока нет принудительного ограничения количества записей в каталоге, хорошая практика должна иметь некоторый предел для записей, которые вы ожидаете.

Ответ 7

Можете ли вы получить реальное количество файлов? Он падает очень близко к 2 ^ n-границам? Не могли бы вы просто запустить из ОЗУ для хранения всех имен файлов?

Я знаю, что в Windows производительность файловой системы будет резко снижаться по мере увеличения количества файлов в папке, но я думал, что linux не пострадает от этой проблемы, по крайней мере, если вы используете командную строку. Бог поможет вам, если вы попытаетесь получить что-то вроде nautilus, чтобы открыть папку с таким количеством файлов.

Мне также интересно, откуда эти файлы. Вы можете запрограммировать имена файлов? В этом случае вы могли бы написать небольшую программу для сортировки их в несколько подпапок. Часто перечисление имени конкретного файла предоставляет вам доступ, когда попытка поиска имени не удастся. Например, у меня есть папка в окнах с примерно 85 000 файлов, где это работает.

Если этот метод будет успешным, вы можете попробовать найти способ сделать этот вид постоянным, даже если он просто запускает эту небольшую программу в качестве задания cron. Он будет работать особенно хорошо, если вы можете отсортировать файлы по дате где-нибудь.

Ответ 8

Если вы не получаете сообщение об ошибке, ls работает, но очень медленно. Вы можете попробовать посмотреть только первые десять файлов, например:

ls -f | head -10

Если вам понадобится некоторое время просмотреть данные о файле, вы можете сначала поместить их в файл. Вероятно, вы захотите отправить результат в другой каталог, чем тот, который вы публикуете на данный момент!

ls > ~/lots-of-files.txt

Если вы хотите что-то сделать с файлами, вы можете использовать xargs. Если вы решите написать какой-либо script для выполнения этой работы, убедитесь, что ваш script будет обрабатывать список файлов как поток, а не все одновременно. Здесь приведен пример перемещения всех файлов.

ls | xargs -I thefilename mv thefilename ~/some/other/directory

Вы можете комбинировать это с головой для перемещения меньшего количества файлов.

ls | head -10000 | xargs -I x mv x /first/ten/thousand/files/go/here

Вы можете объединить ls | head в оболочку script, чтобы разделить файлы на кучу каталогов с управляемым количеством файлов в каждом.

Ответ 9

Для NetBackup двоичные файлы, которые анализируют каталоги в клиентах, выполняют некоторый тип перечисления тайм-аутов из-за огромного количества файлов в каждой папке (около миллиона в папке, рабочей папке SAP).

Мое решение было (как пишет Чарльз Даффи в этой теме), реорганизовать папки в подпапках с меньшим количеством архивов.

Ответ 10

Другим вариантом является find:

find . -name * -exec somcommands {} \;

{} - абсолютный путь к файлу.

Преимущество/недостаток заключается в том, что файлы обрабатываются один за другим.

find . -name * > ls.txt

будет печатать все имена файлов в ls.txt

find . -name * -exec ls -l {} \; > ls.txt

будет печатать всю информационную форму ls для каждого файла в ls.txt