2008-09-02 3 views
32

Есть ли максимальное количество индексных дескрипторов в одном каталоге?Максимальное количество индексов в каталоге?

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

+0

Вы имеете в виду максимальное количество записей в одном каталоге, не так ли?В конце концов, вы могли бы сделать 2 миллиона жестких ссылок на один и тот же файл в одном каталоге, и это вызовет ту же проблему. – 2008-09-17 04:08:36

ответ

0

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

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

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

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

10

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

Попробуйте это:

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

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

0

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

ls -f | head -10

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

ls > ~/lots-of-files.txt

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

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 в сценарий оболочки к тому, что будет разделить файлы в кучу каталогов с управляемым числом файлов в каждом.

+1

ls | head -10 не работает, чтобы получить немедленный результат, потому что ls сортируется - поэтому ему нужно все прочитать, прежде чем он сможет что-либо напечатать. – 2008-10-20 03:20:26

+0

В этом случае попробуйте: ls -f | head -10 – 2008-10-27 17:20:34

48

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

17

Пробег: ls -U или ls -f.

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

3

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

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

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

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

1

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

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

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

0

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

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

-1

Другой вариант find:

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

{} является абсолютным путь_к_файлу.

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

find . -name * > ls.txt

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

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

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

Смежные вопросы