Ответ 1
df -i
должен указать вам количество используемых и доступных inodes файловой системы inodes.
Существует ли максимальное количество inodes в одном каталоге?
У меня есть каталог из более чем 2 миллионов файлов и не могу заставить команду ls
работать с этим каталогом. Итак, теперь мне интересно, превысил ли я лимит на inodes в Linux. Существует ли предел до численного предела 2 ^ 64?
df -i
должен указать вам количество используемых и доступных inodes файловой системы inodes.
Попробуйте ls -U
или ls -f
.
ls
, по умолчанию сортирует файлы по алфавиту. Если у вас 2 миллиона файлов, этот вид может занять много времени. Если ls -U
(или, возможно, ls -f
), имена файлов будут немедленно распечатаны.
Нет. Пределы Inode относятся к каждой файловой системе и решаются на момент создания файловой системы. Вы могли бы нанести другой лимит, или, может быть, "ls" просто не справляется с этим.
Попробуйте следующее:
tune2fs -l /dev/DEVICE | grep -i inode
Он должен рассказать вам все виды информации, связанной с inode.
То, что вы нанесли, является внутренним пределом ls. Вот статья, которая объясняет это довольно хорошо: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with-ls/
Максимальный размер каталога зависит от файловой системы, и, следовательно, точный предел изменяется. Однако наличие очень больших каталогов - это плохая практика.
Вам следует подумать о том, чтобы ваши каталоги были меньше, сортируя файлы в подкаталоги. Одной из общих схем является использование первых двух символов для поддиректории первого уровня, как показано ниже:
${topdir}/aa/aardvark ${topdir}/ai/airplane
Это особенно хорошо работает при использовании UUID, GUID или хэш-значений содержимого для именования.
Как заметил Роб Адамс, ls сортирует файлы перед их отображением. Обратите внимание: если вы используете NFS, сервер NFS будет сортировать каталог перед его отправкой, а 2 миллиона записей могут занимать больше времени, чем таймаут NFS. Это делает каталог незарегистрированным через NFS, даже с флагом -f.
Это может быть справедливо и для других сетевых файловых систем.
Пока нет принудительного ограничения количества записей в каталоге, хорошая практика должна иметь некоторый предел для записей, которые вы ожидаете.
Можете ли вы получить реальное количество файлов? Он падает очень близко к 2 ^ n-границам? Не могли бы вы просто запустить из ОЗУ для хранения всех имен файлов?
Я знаю, что в Windows производительность файловой системы будет резко снижаться по мере увеличения количества файлов в папке, но я думал, что linux не пострадает от этой проблемы, по крайней мере, если вы используете командную строку. Бог поможет вам, если вы попытаетесь получить что-то вроде nautilus, чтобы открыть папку с таким количеством файлов.
Мне также интересно, откуда эти файлы. Вы можете запрограммировать имена файлов? В этом случае вы могли бы написать небольшую программу для сортировки их в несколько подпапок. Часто перечисление имени конкретного файла предоставляет вам доступ, когда попытка поиска имени не удастся. Например, у меня есть папка в окнах с примерно 85 000 файлов, где это работает.
Если этот метод будет успешным, вы можете попробовать найти способ сделать этот вид постоянным, даже если он просто запускает эту небольшую программу в качестве задания cron. Он будет работать особенно хорошо, если вы можете отсортировать файлы по дате где-нибудь.
Если вы не получаете сообщение об ошибке, 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, чтобы разделить файлы на кучу каталогов с управляемым количеством файлов в каждом.
Для NetBackup двоичные файлы, которые анализируют каталоги в клиентах, выполняют некоторый тип перечисления тайм-аутов из-за огромного количества файлов в каждой папке (около миллиона в папке, рабочей папке SAP).
Мое решение было (как пишет Чарльз Даффи в этой теме), реорганизовать папки в подпапках с меньшим количеством архивов.
Другим вариантом является find
:
find . -name * -exec somcommands {} \;
{}
- абсолютный путь к файлу.
Преимущество/недостаток заключается в том, что файлы обрабатываются один за другим.
find . -name * > ls.txt
будет печатать все имена файлов в ls.txt
find . -name * -exec ls -l {} \; > ls.txt
будет печатать всю информационную форму ls для каждого файла в ls.txt