Como encontrar o diretório ext4 maior (nas entradas, não no tamanho)?

6

Ubuntu 10.04.3 LTS x86_64, estou vendo o seguinte em /var/log/messages :

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

Informação relevante de 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

Eu já li algumas outras perguntas, como ext3_dx_add_entry: Directory index full e rm em um diretório com milhões de arquivos ; aqueles me fizeram pensar que deve haver um diretório com um grande número de itens em algum lugar.

Como é uma organização de diretórios bastante complexa, tenho um problema básico: como posso encontrar o diretório que está gerando essas mensagens?

    
por S19N 07.08.2012 / 16:46

2 respostas

4

O seguinte one-liner lhe dará uma lista de quantos arquivos estão em cada diretório e ordenará pelos dez primeiros. Ele será executado recursivamente a partir do seu diretório de trabalho atual, então eu não sugiro que você execute isto de / a menos que você não tenha absolutamente nenhuma pista de onde os diretórios grandes possam estar.

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 

A saída será semelhante à seguinte:

[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/

Se você é um pouco cauteloso em rodar uma única linha, procure por todos os diretórios que possuem um tamanho de mais de 50k ou mais. Novamente encontre seu amigo aqui:

find ./ -type d -size +50k

Se você tiver vários pontos de montagem, um df -i ajudará a diminuir a montagem que está ficando sem ou não funcionou.

    
por 07.08.2012 / 18:43
0

Usando sh na parte -exec do comando, você pode iniciar um outro shell e executar seus comandos lá muito bem.

find . -name "*.dat" -exec csh -c 'echo -n $1; grep ID $1 | wc -l' {} {} \;

Ou, no meu caso, ao contar arquivos em diretórios. Eu uso "ls -f", uma vez que produz a saída ls não classificada, o que é significativamente mais rápido ao tentar separar a saída antes de contar.

com nova linha entre o nome do diretório e a contagem

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

com tabulação entre o nome do dir e a contagem

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

link

    
por 27.08.2012 / 13:10

Tags