Назад | Перейти на главную страницу

Как найти самый большой (по записям, а не по размеру) каталог ext4?

Ubuntu 10.04.3 LTS x86_64, я вижу следующее в /var/log/messages:

EXT4-fs warning (device sda3): ext4_dx_add_entry: Directory index full!

Соответствующая информация от dumpe2fs:

Filesystem features:      has_journal ext_attr resize_inode dir_index filetype
  needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg
  dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Free blocks:              165479247
Free inodes:              454382328
Block size:               2048
Inode size:               256

Я уже читал некоторые другие вопросы, например ext3_dx_add_entry: Индекс каталога заполнен и rm в каталоге с миллионами файлов; это заставило меня подумать, что где-то должен быть каталог с большим количеством элементов.

Поскольку это довольно сложная организация каталогов, у меня возникает основная проблема: как мне найти каталог, который генерирует эти сообщения?

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

find . -type f | awk '{dir=gensub(/(.+\/).+/,"\\1","g (file://1%22,%22g/)"); dir_list[dir]++} END {for (d in dir_list) printf "%s %s\n",dir_list[d],d}d' | sort -nr |head 

Результат будет примерно таким:

[user@localhost ~]# find . -type f | awk '{dir=gensub(/(.+\/).+/,"\\1","g (file://1%22,%22g/)"); dir_list[dir]++} END {for (d in dir_list) printf "%s %s\n",dir_list[d],d}d' | sort -nr | head
2048 ./test19/
2048 ./test18/
2048 ./test17/
2048 ./test16/
2048 ./test15/
2048 ./test14/
2048 ./test13/
2048 ./test12/
2048 ./test11/
2048 ./test10/

Если вы немного опасаетесь запускать такую ​​однострочную, просто найдите все каталоги, размер которых превышает 50 КБ или около того. И снова находка будет здесь вашим другом:

find ./ -type d -size +50k

Если у вас есть несколько точек монтирования, df -i поможет вам сузить, у какого монтирования заканчиваются или заканчиваются inodes.

Используя sh в части команды -exec, вы можете запустить другую оболочку и довольно красиво запускать там свои команды.

найти . -name "* .dat" -exec csh -c 'echo -n $ 1; grep ID $ 1 | wc -l '{} {} \;

Или в моем случае при подсчете файлов в каталогах. Я использую "ls -f", поскольку он дает вывод ls без сортировки, что значительно быстрее, чем попытка отсортировать вывод перед подсчетом.

с новой строкой между именем каталога и количеством

найти / somedir / some / dir -type d -print -exec sh -c 'ls -f $ 1 / * | wc -l '{} {} \;

с табуляцией между именем каталога и количеством

найти / somedir / some / dir -type d -exec bash -c 'echo -en "$ 1 \ t"; ls -f $ 1 / * | wc -l '{} {} \;

http://www.compuspec.net/reference/os/solaris/find/find_and_execute_with_pipe.shtml