Não espere que isso ocorra rapidamente ...
cd para um diretório em que você suspeita que possa haver um subdiretório com muitos inodes. Se esse script demorar muito, você provavelmente encontrou onde procurar no sistema de arquivos. / var é um bom começo ...
Caso contrário, se você mudar para o diretório superior desse sistema de arquivos e executar e aguardar a conclusão, você encontrará o diretório com todos os inodes.
find . -type d |
while
read line
do
echo "$( find "$line" -maxdepth 1 | wc -l) $line"
done |
sort -rn | less
Não estou preocupado com o custo da classificação. Eu executei um teste e a triagem da saída não classificada daquela contra 350.000 diretórios levou 8 segundos. A descoberta inicial levou. O custo real está abrindo todos esses diretórios no loop while. (o loop em si leva 22 segundos). (Os dados de teste foram executados em um subdiretório com 350.000 diretórios, um dos quais com um milhão de arquivos e o restante entre 1 e 15 diretórios).
Várias pessoas apontaram que ls não é bom nisso, porque classifica a saída. Eu tentei eco, mas isso também não é ótimo. Alguém apontou que o stat fornece essas informações (número de entradas do diretório), mas não é portátil. Acontece que find -maxdepth é realmente rápido ao abrir diretórios e conta .files, então ... aqui está ... pontos para todos!
Se o problema for um diretório com muitos arquivos, aqui está uma solução simples:
A idéia por trás da
find
linha é que o tamanho de um diretório é proporcional à quantidade de arquivos diretamente dentro desse diretório. Então, aqui procuramos diretórios com toneladas de arquivos dentro dele.Se você não quer adivinhar um número e prefere listar todos os diretórios suspeitos ordenados por "tamanho", também é fácil:
fonte
Grrr, comentar requer 50 repetições. Portanto, esta resposta é na verdade um comentário sobre a resposta de chris.
Como o questionador provavelmente não se importa com todos os diretórios, apenas com os piores, o uso da classificação provavelmente é um exagero muito caro.
Isso não é tão completo quanto a sua versão, mas o que isso faz é imprimir linhas se elas forem maiores que o máximo anterior, reduzindo bastante a quantidade de ruído impressa e economizando as despesas da classificação.
A desvantagem disso é que, se você tiver 2 diretórios muito grandes, e o primeiro tiver 1 inode a mais que o 2º, você nunca verá o 2º.
Uma solução mais completa seria escrever um script perl mais inteligente que monitore os 10 principais valores vistos e os imprima no final. Mas isso é muito longo para uma resposta rápida à falha do servidor.
Além disso, alguns scripts perl mais inteligentes permitem que você pule o loop while - na maioria das plataformas, ls classifica os resultados e isso também pode ser muito caro para diretórios grandes. O tipo ls não é necessário aqui, pois tudo o que importa é a contagem.
fonte
Você pode usar este pequeno trecho:
Ele imprimirá quantos arquivos e diretórios existem em cada um dos diretórios da pasta atual, com os maiores infratores na parte inferior. Isso o ajudará a encontrar diretórios com muitos arquivos. ( mais informações )
fonte
Esta não é uma resposta direta à sua pergunta, mas pesquisar arquivos modificados recentemente com um tamanho pequeno usando find pode restringir sua pesquisa:
fonte
ls não vai encontrar arquivos cujos nomes começam com um ponto. Usar find evita isso. Ele localiza todos os arquivos na árvore de diretórios, exclui o nome da base do final de cada caminho e conta o número de vezes que cada caminho de diretório aparece na saída resultante. Você pode ter que colocar o "!" entre aspas, se o seu shell reclamar.
Os inodes também podem ser usados por arquivos que foram excluídos, mas estão sendo mantidos abertos por um processo em execução. Se este pacote Munin incluir programas em execução constante, outra coisa a verificar é se está mantendo um número incomum de arquivos.
fonte
Eu faria uma força bruta: execute um fio de trip em todo o dispositivo para obter uma linha de base, depois execute uma verificação algum tempo depois e o diretório incorreto se destacará como um polegar dolorido.
fonte
(não poder comentar está realmente ficando velho - isso é para ficar com fome)
egorgry - ls -i imprime o inode NUMBER para uma entrada, não o inode COUNT.
Experimente com um arquivo no seu diretório - você (provavelmente) verá um número igualmente alto, mas não é a contagem de inodes, é apenas o # inode para o qual a entrada do diretório aponta.
fonte
Atualizar
Um liner que retorna a contagem de inodes de cada filho de um determinado diretório com as maiores entradas na parte inferior.
Resposta original
Execute-o assim (considerando que o script acima reside em um arquivo executável no seu diretório de trabalho)
fonte
o uso do inode é de aproximadamente um por arquivo ou diretório, certo? Então faz
para contar aproximadamente quantos inodes são usados em [path].
fonte
Tentei escrever um pipeline de shell eficiente, mas ele se tornou pesado e lento ou impreciso, por exemplo,
listará diretórios de folha (e alguns outros) com mais de 1000 arquivos neles. Então, aqui está um script Perl para fazê-lo com eficiência, tanto em tempo quanto em RAM. Saída é como
«Arquivos na subárvore» «arquivos diretamente no diretório» «nome do diretório»
para que você possa massagear e filtrá-lo facilmente usando ferramentas normais, por exemplo, sort (1) ou awk (1) como acima.
fonte
minha casa no meu laptop está usando 131191 inodes.
fonte