Solución 1:
No espere que esto se ejecute rápidamente...
cd a un directorio donde sospecha que podría haber un subdirectorio con muchos inodos. Si esta secuencia de comandos lleva una gran cantidad de tiempo, es probable que haya encontrado dónde buscar en el sistema de archivos. /var es un buen comienzo...
De lo contrario, si cambia al directorio superior en ese sistema de archivos y ejecuta esto y espera a que termine, encontrará el directorio con todos los inodos.
find . -type d |
while
read line
do
echo "$( find "$line" -maxdepth 1 | wc -l) $line"
done |
sort -rn | less
No estoy preocupado por el costo de clasificación. Realicé una prueba y clasifiqué la salida sin clasificar de eso en 350 000 directorios, lo que llevó 8 segundos. El hallazgo inicial tomó . El costo real es abrir todos estos directorios en el ciclo while. (el ciclo en sí toma 22 segundos). (Los datos de prueba se ejecutaron en un subdirectorio con 350 000 directorios, uno de los cuales tenía un millón de archivos, el resto tenía entre 1 y 15 directorios).
Varias personas han señalado que ls no es bueno en eso porque ordena la salida. Probé echo, pero eso tampoco es genial. Alguien más había señalado que stat proporciona esta información (número de entradas de directorio) pero que no es portátil. Resulta que find -max depth es muy rápido para abrir directorios y cuenta archivos .files, así que... aquí está... ¡puntos para todos!
Solución 2:
Si el problema es un directorio con demasiados archivos, aquí hay una solución simple:
# Let's find which partition is out of inodes:
$ df -hi
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 2.4M 2.4M 0 100% /
...
# Okay, now we know the mount point with no free inodes,
# let's find a directory with too many files:
$ find / -xdev -size +100k -type d
La idea detrás del find
La línea es que el tamaño de un directorio es proporcional a la cantidad de archivos directamente dentro de ese directorio. Entonces, aquí buscamos directorios con toneladas de archivos dentro.
Si no quiere adivinar un número y prefiere enumerar todos los directorios sospechosos ordenados por "tamaño", también es fácil:
# Remove the "sort" command if you want incremental output
find / -xdev -size +10k -type d -printf '%s %p\n' | sort -n
Solución 3:
Grrr, comentar requiere 50 repeticiones. Así que esta respuesta es en realidad un comentario sobre la respuesta de Chris.
Dado que al interrogador probablemente no le importen todos los directorios, solo los peores, entonces usar sort es probablemente una exageración muy costosa.
find . -type d |
while
read line
do
echo "$(ls "$line" | wc -l) $line"
done |
perl -a -ne'next unless $F[0]>=$max; print; $max=$F[0]' | less
Esto no es tan completo como su versión, pero lo que hace es imprimir líneas si son más grandes que el máximo anterior, lo que reduce en gran medida la cantidad de ruido impreso y ahorra los gastos de clasificación.
La desventaja de esto es que si tiene 2 directorios muy grandes y el primero tiene 1 inodo más que el segundo, nunca verá el segundo.
Una solución más completa sería escribir un script perl más inteligente que realice un seguimiento de los 10 valores principales vistos y los imprima al final. Pero eso es demasiado tiempo para una respuesta rápida de falla del servidor.
Además, algunas secuencias de comandos perl medianamente más inteligentes le permitirían omitir el ciclo while:en la mayoría de las plataformas, ls ordena los resultados, y eso también puede ser muy costoso para directorios grandes. El tipo ls no es necesario aquí, ya que todo lo que nos importa es el conteo.
Solución 4:
Puedes usar este pequeño fragmento:
find | cut -d/ -f2 | uniq -c | sort -n
Imprimirá cuántos archivos y directorios hay en cada uno de los directorios de la carpeta actual, con los infractores más grandes en la parte inferior. Le ayudará a encontrar directorios que tengan muchos archivos. (más información)
Solución 5:
Esta no es una respuesta directa a su pregunta, pero la búsqueda de archivos modificados recientemente con un tamaño pequeño mediante find podría reducir su búsqueda:
find / -mmin -10 -size -20k