¿Cómo puedo usar find
para generar una lista de directorios que contienen la mayor cantidad de archivos? Me gustaría que la lista sea de mayor a menor. Solo me gustaría que la lista tenga 1 nivel de profundidad, y normalmente ejecuto este comando desde la parte superior de mi sistema de archivos, es decir /
.
21
Respuestas:
Usando herramientas GNU:
Esto usa dos
find
comandos. El primero busca directorios y los canaliza a unwhile
bucle ejecuta el siguiente hallazgo para cada directorio. El segundo enumera todos los archivos / directorios secundarios en el primer nivel mientras losgrep
cuenta. Elgrep
permite-print0
ser utilizado con el segundo hallazgo yawc
que no tiene un-z
equivalente. Esto evita que los nombres de archivo con una nueva línea se cuenten dos veces (aunque usarwc
y no-print0
no haría mucha diferencia).El resultado del segundo
find
se coloca en el argumento para queecho
así y el nombre del directorio se pueda colocar fácilmente en la misma línea (la$(..)
construcción recorta automáticamente la nueva línea al final degrep
). Las líneas se ordenan por número y los 50 números más grandes se muestran conhead
.Tenga en cuenta que esto también incluirá los directorios de nivel superior de los puntos de montaje. Una manera simple de evitar esto es usar un montaje de enlace y luego usar el directorio del montaje. Para hacer esto:
Una solución más portátil utiliza una instancia de shell diferente para cada directorio (también se responde aquí ):
Salida de muestra:
fuente
ACTUALIZACIÓN: hice todo eso a continuación, lo cual es genial, pero se me ocurrió una mejor manera de ordenar los directorios por uso de inodo:
Y si quieres permanecer en el mismo sistema de archivos que haces:
Aquí hay un ejemplo de salida:
AHORA CON LS:
Varias personas mencionaron que no tienen coreutils actualizados y que la opción --inodes no está disponible para ellos. Entonces, aquí está ls:
Esto me proporciona resultados prácticamente idénticos al
du
comando:DU:
LS:
Creo que la
include
cosa solo depende del directorio en el que se ve el programa al principio, porque son los mismos archivos y están vinculados. Un poco como la cosa de arriba. Sin embargo, podría estar equivocado al respecto, y agradezco la corrección ...El método subyacente a esto es que reemplazo cada uno de
ls
los nombres de archivo con el nombre del directorio que lo contiene ensed.
Siguiente ... Bueno, yo también estoy un poco confuso. Estoy bastante seguro de que está contando con precisión los archivos, como puede ver aquí:DU DEMO
Haga un directorio de prueba:
Algunos directorios secundarios:
Crea algunos archivos:
Algunos enlaces duros:
Mira los enlaces duros:
Se cuentan solo, pero sube un directorio ...
Luego ejecuté mi script de ejecución desde abajo y:
Y de Graeme:
Así que creo que esto muestra que la única forma de contar inodos es por inodo. Y debido a que contar archivos significa contar inodos, no puede contar doblemente inodos: para contar archivos con precisión, los inodos no pueden contarse más de una vez.
ANTIGUO:
Encuentro esto más rápido y es portátil:
No es necesario
-exec
para cada directorio, solo usa elsh
proceso uno y el otrofind
. Tengo que obtener elset -- $glob
derecho de incluir.hidden
archivos y todo lo demás, pero está muy cerca y muy rápido. Simplemente entraríacd
en el directorio raíz que debería ser para la comprobación y listo.Aquí hay una muestra de mi salida ejecutada desde
/usr
:También lo uso
sed
en la parte inferior para recortarlo a los 50 mejores resultados.head
sería más rápido, por supuesto, pero también recorto cada línea si es necesario:Es crudo, lo admito, pero fue un pensamiento. Otro dispositivo burdo que uso es el vertido
2>stderr
para ambosfind
ycd
dentro2>/dev/null
. Es más limpio que mirar errores de permisos para directorios que no puedo leer sin acceso a la raíz, tal vez debería especificar esofind
. Bueno, es un trabajo en progreso.Ok, entonces arreglé los globos de concha así:
Realmente iba a hacer una pregunta sobre cómo podría hacerse, pero mientras escribía el título de la pregunta, el sitio me señaló una pregunta relacionada sugerida donde, he aquí, Stephane ya había intervenido . Entonces eso fue conveniente. Aparentemente,
[^.],
aunque está bien soportado, no es portátil y debes usar el!bang.
que encontré en el comentario de Stephane allí.De todos modos, simplemente jalar archivos ocultos no fue suficiente, obviamente. Entonces tengo que hacerlo
set
dos veces para evitar buscar posicionales para el literal$glob
. Aún así, no parece afectar el rendimiento en absoluto, y agrega de manera confiable todos los archivos en el directorio.fuente
ls -i
y ... supongo ... probablementegrep
... tal vez ... bueno, estás usando,-xdev,
que es un comienzo ...uniq
ysort
?du
estás corriendo? Midu
no tiene otra--inodes
opción.¿Por qué no usar algo como KDirStat? Aunque originalmente fue escrito para KDE, pero también funciona bien con GNOME. Le brinda la mejor vista del número de archivos / directorios y el uso respectivo en la GUI
fuente