Я видел этот вопрос в stackoverflow, но мне не понравился ни один из ответов, и это действительно вопрос, который должен быть здесь, на U & L в любом случае.
Обычно для каждого файла в файловой системе используется индекс. Таким образом, отсутствие inode обычно означает, что у вас много маленьких файлов. Таким образом, возникает вопрос: «В каком каталоге находится большое количество файлов?».
В этом случае файловая система, о которой мы заботимся, является корневой файловой системой /
, поэтому мы можем использовать следующую команду:
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n
Это выведет список всех каталогов в файловой системе с префиксом количества файлов (и подкаталогов) в этом каталоге. Таким образом, каталог с наибольшим количеством файлов будет внизу.
В моем случае это выглядит следующим образом:
1202 /usr/share/man/man1
2714 /usr/share/man/man3
2826 /var/lib/dpkg/info
306588 /var/spool/postfix/maildrop
Так что в основном /var/spool/postfix/maildrop
потребляет все inode.
Обратите внимание, у этого ответа есть три предостережения, о которых я могу подумать. Он неправильно обрабатывает что-либо с символами новой строки в пути. Я знаю , что моя файловая не имеет файлов с символами новой строки, и так как это используется только для потребления человеком, потенциальная проблема не стоит решать (и всегда можно заменить \n
с \0
и использовать sort -z
выше). Это также не обрабатывает, если файлы распределены среди большого количества каталогов. Хотя это маловероятно, поэтому я считаю риск приемлемым. Он также будет подсчитывать жесткие ссылки на один и тот же файл (таким образом, используя только один индекс) несколько раз. Опять же, вряд ли дать ложные срабатывания
Основная причина, по которой мне не понравился ни один из ответов на ответ stackoverflow, заключается в том, что все они пересекают границы файловой системы. Поскольку моя проблема была связана с корневой файловой системой, это означает, что она будет проходить через каждую монтированную файловую систему. Бросание -xdev
команд поиска даже не будет работать должным образом.
Например, самый голосующий ответ:
for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
Если мы изменим это вместо
for i in `find . -xdev -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
Несмотря на то, что /mnt/foo
это монтирование, оно также является каталогом в корневой файловой системе, поэтому оно включается find . -mount -type d
и затем передается в каталог ls -a $i
, который погрузится в монтирование.
find
В моем ответе вместо перечисляет каталог каждого файла на горе. Так в основном с файловой структурой, такой как:
/foo/bar
/foo/baz
/pop/tart
мы в конечном итоге
/foo
/foo
/pop
Так что нам просто нужно посчитать количество повторяющихся строк.
/tmp
а затем система настроена на монтирование tmpfs/tmp
. Тогда вы не сможете найти файлы вfind
одиночку. Вряд ли сенарио, но стоит отметить.-printf
это расширение GNU для поиска, поскольку версия BSD, доступная в OS X, не поддерживает его.Это перепечатано отсюда по указанию аскера:
И если вы хотите остаться в той же файловой системе, вы делаете:
Вот пример выходных данных:
ТЕПЕРЬ С ЛС:
Несколько человек упомянули, что у них нет современных coreutils, и опция --inodes для них недоступна. Итак, вот ls:
Если вам любопытно, сердце этого утомительного кусочка
regex
заменяетfilename
в каждом изls's
результатов рекурсивного поиска имя каталога, в котором он был найден. Оттуда это просто вопрос сжатия повторяющихся номеров инодов, затем подсчета повторяющихся имен каталогов и соответствующей сортировки.Эта
-U
опция особенно полезна при сортировке, поскольку она не сортирует, а представляет список каталогов в исходном порядке или, другими словами, поinode
номеру.И, конечно,
-1
это невероятно полезно в том смысле, что он обеспечивает один результат на строку, независимо от возможного включения новых строк в именах файлов или других поразительно неудачных проблем, которые могут возникнуть при попытке проанализировать список.И, конечно,
-A
для всех,-i
для inode и-R
для рекурсии, и это длинный и короткий путь .Основной метод заключается в том, что я заменяю каждое из имен файлов ls на содержащее его имя каталога в sed. Исходя из этого ... Ну, я немного нечеткий сам. Я вполне уверен, что он точно считает файлы, как вы можете видеть здесь:
Это дает мне почти идентичные результаты для
du
команды:DU:
LS:
Я думаю
include
, что все зависит от того, на какой каталог программа сначала смотрится - потому что они одинаковые и жестко связаны. Вроде как вещь выше. Хотя я могу ошибаться в этом - и я приветствую исправление ...DU DEMO
Создайте тестовый каталог:
Некоторые детские каталоги:
Сделайте несколько файлов:
Некоторые жесткие ссылки:
Посмотрите на жесткие ссылки:
Они считаются в одиночку, но на один каталог вверх ...
Затем я запустил мой скрипт запуска снизу и:
И Грэм:
Так что я думаю, что это показывает, что единственный способ подсчитать inode - это inode. А поскольку подсчет файлов означает подсчет инодов, вы не можете вдвойне подсчитывать иноды - для точного подсчета файлов иноды не могут быть подсчитаны более одного раза.
источник
--inodes
? какие "варианты" / "вкусы" / "posix-wannabes" / "реализации" / что бы это ни было?Я использовал этот ответ от SO Q & A под названием: Где используются все мои иноды? когда наш NAS закончился около 2 лет назад:
пример
Проверка Inode устройства
В зависимости от вашего NAS он может не предлагать полнофункциональную
df
команду. Таким образом, в этих случаях вы можете использоватьtune2fs
вместо этого:Пересечение границ файловой системы
Вы можете использовать
-xdev
переключатель, чтобы направитьfind
сужение поиска только на устройство, с которого вы начинаете поиск.пример
Скажем, у меня есть
/home
автоподключение моего каталога через NFS с моего NAS, чье имя - mulder.Обратите внимание, что точка монтирования все еще считается локальной для системы.
Теперь, когда я начинаю
find
:Не найдено
/home
ни одного из автоматически смонтированного содержимого, потому что оно находится на другом устройстве!Типы файловых систем
Вы можете использовать переключатель в положении
find
,-fstype
чтобы контролировать , какой тип - х файловые системыfind
будут смотреть.пример
Какая файловая система у меня есть?
Таким образом, вы можете использовать это для управления пересечением:
только ext3
только нфс
ext3 и ext4
источник
/
все заполнено, и у вас смонтированы сетевые файловые системы, вы не хотите погружаться в сетевые файловые системы.-fstype
кfind
.-xtype
исключает файловые системы, она смотрит на тип файла. Я нахожу только примеры, подобные этому:find . \( -fstype nfs -prune \)
find
пересечения границ файловой системы. В его бывшем. он упоминает «Как если / заполнено, а у вас смонтированы сетевые файловые системы, вы не хотите углубляться в сетевые файловые системы».Команда для поиска используемого инода:
источник
Чтобы просмотреть подробное использование inode для
/
, используйте следующую команду:источник
Определенно ответ с максимальным числом голосов помогает понять концепцию inode в linux и unix, однако это не очень помогает, когда речь идет о реальной проблеме удаления или удаления inode с диска. Более простой способ сделать это в системах на основе Ubuntu - удалить ненужные заголовки и образы ядра Linux.
Сделал бы это для вас. В моем случае использование inode было 78%, из-за чего я получил предупреждение.
После выполнения
sudo apt-get autoremove
команды он снизился до 29%Это было только мое наблюдение, которое сэкономило мое время. Люди могут найти лучшее решение, чем это.
источник
Я считаю, что это быстрее и проще, используя следующую команду:
Затем вы можете, например, зайти
var
и посмотреть, что там за большой каталог, использующий каталоги.источник
Каждый ответ до сих пор предполагает, что проблема связана со многими файлами в одном каталоге, а не со многими подкаталогами, которые вносят свой вклад в проблему. К счастью, решение состоит в том, чтобы просто использовать меньше флагов.
Или с укороченными вариантами:
du --inodes -x | sort -n
. К сожалению, не все версииdu
имеют опцию inodes.источник